PL/SQL结构
???? 块头???????? [可省略]
IS
???? 声明部分???????? [可省略]
BEGIN
???? 执行部分
EXCEPTION
???? 异常部分 [可省略]
END;
?
块头
{ {PROCEDURE|FUNCTION}? name? IS| <<name>> }
声明部分
在此处声明块中使用的变量、游标、类型、本地过程和函数。
声明变量
变量:
variable_name type [NOT NULL] [:=initial_value]
常量:
constant_name CONSTANT type :=initial_value
数据库列类型变量:
variable_name [schema.] table_name.column_name%TYPE
已有变量类型变量:
variable_name variable1%TYPE
?
常用数据类型
String/Varchar2,Number,Boolean,Date
?
声明记录类型
TYPE type_name IS RECORD(
variable_name type [NOT NULL] [:=initial_value]
[,variable_name type [NOT NULL] [:=initial_value]...]
)
?
声明记录类型变量:
record_name type_name;
?
通过使用INTO语句,可是使记录类型的变量成为SELECT语句的目标。
?
记录类型变量引用字段:
record_name.variable_name
?
%ROWTYPE
record_name [schema.]table_name%ROWTYPE
通过%ROWTYPE可取代类型声明,直接将变量声明为记录类型变量。
?
索引表
类似于JavaScript 中的数组Array。
TYPE table_name IS TABLE OF
{type | variable%TYPE | [schema.]table_name%ROWTYPE}
INDEX BY BINARY_INTEGER
?
表类型声明的结果是具有两列的内存表:
KEY (总是 BINARY_INTEGER)
VALUE(在表声明中定义的类型)
?
声明索引表类型变量
variable_name table_name;
使用索引表类型变量
variable_name(key);
索引表方法
?
方法 | 返回值 | 描述 |
COUNT | NUMBER | 返回表中的行数 |
DELETE | ? | 从表中删除所有行 |
DELETE(x) | ? | 从表中删除具有键x的行 |
DELETE(x,y) | ? | 删除表中有x~y之间的键的所有行 |
EXISTS(x) | BOOLEAN | 返回表中是否具有键为x的行。 |
FIRST | BINARY_INTEGER | 返回表中的最小的键值 |
LAST | BINARY_INTEGER | 返回表中的最大的键值 |
NEXT(x) | BINARY_INTEGER | 返回表中比提供的键要大的最小的行键 |
PRIOR(x) | BINARY_INTEGER | 返回表中比提供的键要小的最小的行键 |
注:DELETE方法只可用于Oracle8或更高版本中,以前版本中没有可以删除行的方法。
可变数组
企业版独有
TYPE vartype_name IS {VARRAY | VARYING} (maxsize) OF data_type [NOT NULL]
?
?
示例:
DECLARE
--声明可变数组类型
TYPE num_array IS VARRAY (100) OF NUMBER ;
--声明数组变量
num1 num_array;
num2 num_array;
BEGIN
--调用构造方法
num1 := num_array();
num2 := num_array(1,2,3);
?
--每增加一个值都需先扩展数组
num1.extend;
num1(1) :=1; --与很多高级语言不同,其索引从1开始
?
num2.extend ;--扩展不可超出最大声明大小
num2(4):=4;
END;
?
可变数组方法
?
方法 | 返回值 | 描述 |
COUNT | INTEGER | 返回数组中的条目数 |
DELETE | ? | 从数组删除所有条目 |
DELETE(x) | ? | 从数组删除索引为x的条目 |
DELETE(x,y) | ? | 删除数组索引在x~y之间的所有条目 |
EXISTS(x) | BOOLEAN | 返回数组是否具有索引为x的条目 |
FIRST | INTEGER | 返回数组的最小的索引值 |
LAST | INTEGER | 返回数组的最大的索引值 |
NEXT(x) | INTEGER | 返回数组比提供的索引要大的最小的索引 |
PRIOR(x) | INTEGER | 返回数组比提供的索引要小的最小的索引 |
TRIM | ? | 删除具有最大索引值的条目 |
TRIM(x) | ? | 从数组尾部删除x(可为0)个条目 |
EXTEND | ? | 在数组中增加一个条目 |
EXTEND(x) | ? | 在数组中增加x个条目 |
EXTEND(x,y) | ? | 在数组中增加x个条目,值为索引y对应的条目值 |
LIMIT | INTEGER | 返回数组最大声明大小 |
?
声明游标
CURSOR cursor_name IS
select_statement
[FOR UPDATE [OF column[,... ]] [NOWAIT]
?
使用请参见执行部分介绍。
声明异常
EXCEPTION
Exception_name EXCEPTION
PRAGMA EXCEPTION_INIT
PRAGMA EXCEPTION_INIT (exception_name,ora_number)
将异常处理与指定的Oracle错误号关联。
Oracle错误号通常是负数。如果想跟踪错误号ORA-02292,可使用-2292作为ora_number。
?