- PL/SQL是一种块结构语言,组成单元是逻辑块,每个块可以划分为Declaration section, Executable section, Exception section
- 声明部分包含了变量和常量的数据类型和初始值。由关键字DECLARE开始,如果不需要声明变量或常量,可以忽略这一部分
- 执行部分是PL/SQL中的指令部分,由关键字BEGIN开始
异常处理部分是可选的
[DECLARE]
Declaration Statements
BEGIN
Executable Statements
[EXCEPTION Exception Handlers]
ENDPL/SQL语句必须以分号结束,可以多行,但分号表示该语句结束
- 使用赋值操作符:=或SELECT INTO或FETCH INTO给变量赋值
- 执行部分使用的变量和常量必须在声明部分声明
- 数据定义语言(Data Definition language)不能在执行部分中使用
声明变量:
Variable_Name [CONSTANT] databyte [NOT NULL] [:=DEFAULT EXPRESSION]
赋值:
直接赋值;用户交互赋值;通过SELECT INTO 或FETCH INTO赋值
- 控制语句
IF Condition THEN
Statement;
END IF;
IF Condition THEN
Statements_1;
ELSE
Statements_2;
END IF;
IF Condition1 THEN
Statements_1;
ELSEIF Condition2 THEN
Statements_2;
ELSE
Statements_3;
END IF;
LOOP
Statements;
END LOOP;
WHILE Condition
LOOP
Statements;
END LOOP;
FOR Counter IN [REVERSE] Start_Range…End_Range
LOOP
Statements;
END LOOP;
FOR循环的次数是固定的,Counter是一个隐式声明的变量,初始值是Start_Range,第二个值是Start_Range + 1,直到End_Range,如果Start_Range等于End _Range,循环只执行一次。如果使用了REVERSE关键字,将是一个降序。
执行GOTO语句时,控制会立即跳转到由标签标记的语句(使用<<>>声明)。对于块、循环、IF语句而言,从外层跳转到内层是非法的,从父块跳到子块也是非法的。
BEGIN
EXCEPTION
WHEN Excep_Name1 THEN
Statements1;
WHEN Excep_Name2 THEN
Statements2;
WHEN OTHERS THEN
Statements3;
END;声明游标:DECLARE CURSOR Cursor_Name IS SELECT Statement
OPEN Cursor_Name;
FETCH Cursor_Name INTO Record_List;
CLOSE Cursor_Name;游标的属性
- %ISOPEN
该属性测试游标是否打开,如果没有打开就使用fetch语句将报错 - %FOUND
该属性测试前一个fetch语句是否有值,有值true,否则false - %NOTFOUND
该属性是%found的反逻辑,常用于退出循环 - %ROWCOUNT
该属性返回游标的数据行数
- %ISOPEN
存储过程
PROCEDURE Name [(Parameter[,Parameter, ])]
IS|AS
[Local Declarations]
BEGIN
Execute statements;
[EXCEPTION Exception Handlers]
END [Name];
函数
FUNCTION Name [{Parameter[,Parameter, ])]
RETURN DataTypes
IS
[Local Declarations]
BEGIN
Execute Statements;
[EXCEPTION Exception Handlers]
END [Name];
可以创建被如下语句所触发的触发器:
①DML语句(DELETE,INSERT,UPDATE)
②DDL语句(CREATE,ALTER, DROP)
③数据库操作(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)
包头
创建包头的语句格式如下:
CREATE PACKAGE<包名> IS
变量、常量及数据类型定义;
游标定义;
函数、过程定义和参数列表及返回类型;
END<包名>;
包体
创建包主体部分的语句格式如下:
CREATE PACKAGE BODY<包名>
AS
游标、函数、过程的具体定义;
END<包名>;
使用%TYPE
PL/SQL中变量可以存储表中的数据。这种情况下,变量应该与列具有相同的类型。例如,students表的first_name列类型为VARCHAR2(20):
DECLARE
v_FirstName VARCHAR2(20);如果first_name列的定义改变了(比如类型变为VARCHAR2(25)),那就会导致所有使用这个列的PL/SQL代码都必须修改。可以使用”%TYPE”属性而不是将变量类型硬性编码
例如:
DECLARE
v_FirstName students.first_name%TYPE;使用%TYPE,v_FirstName变量将保持和students表的first_name列类型相同。
%TYPE是非常好的编程风格,使得PL/SQL更加灵活。
使用%ROWTYPE
- 2.1 PL/SQL记录
PL/SQL记录类型类似于C语言中的结构,是一种复合类型,是用户自定义的。
DECLARE
v_StudentID NUMBER(5);
v_FirstName VARCHAR2(20);
v_LastName VARCHAR2(20);这3个变量在逻辑上是相互关联的,指向students表中不同的字段。为这些变量声明一个记录类型。
DECLARE
/Define a record type to hold common student information/
TYPE t_StudentRecord IS RECORD(
StudentID NUMBER(5),
FirstName VARCHAR2(20),
LastName VARCHAR2(20);
)
v_StudentInfo t_StudentRecord;2.2 记录赋值
可以用SELECT语句向记录赋值,将会从数据库中检索数据并将该数据存储到记录中。
SELECT studentID,firstName,lastName
into v_StudentInfo
from students where studentID=32;2.3 使用%ROWTYPE
在PL/SQL中将一个记录声明为和某个数据库行具有相同类型的作法是很常见的。PL/SQL提供了%ROWTYPE运算符,操作更为方便。DECLARE
v_StudentRecord students%ROWTYPE;这将定义一个记录,该记录中的字段与students表中的列相对应
————————–以上参考自http://www.cnblogs.com/reonlyrun/archive/2007/03/09/669164.html
——————————