分类: Oracle
2007-02-02 09:53:34
使用符合数据类型
一个PL/SQL表按两个步骤声明(declare),首先声明表的类型,然后一个PL/SQL表声明为这种类型。例:
DECLARE
TYPE customer_table_type IS TABLE OF customer%ROWTYPE
INDEX BY BINARY_INTEGER;
customer_table customer_table_type;
声明部分必须先基于CUSTOMER表创建CUSTOMER_TABLE_TYPE 的表的数据类型,然后,把CUSTOMER_TABLE 声明成CUSTOMER_TABLE_TYPE类型。
一个记录(record)至少要有一个域,必要时可有多个域。你可以声明和引用嵌套的记录。
记录可以定义为NOT NULL。记录中的数据可以是不同的数据类型。
DECLARE
TYPE product_table_type IS TABLE OF product%ROWTYPE
INDEX BY BINARY_INTEGER;
product_table product_table_type;
执行以下语句:
product_table(10).manufacturer_id := 5;
PL/SQL表PRODUCT_TABLE 的记录10中的MANUFACTURER_ID域被设置为5。
如果不知道数据库字段的数据类型和数目,或者运行时,数据库字段的数据类型和数目可能会改变,可使用%ROWTYPE属性来声明一个PL/SQL域。%ROWTYPE属性可根据数据库表格或视图的字段集合,声明一个PL/SQL记录。
BINARY_INTEGER 是主关键字(primary key)的数据类型,用作PL/SQL的索引。
编写显式游标
游标FOR循环立时不需要FETCH语句的。游标打开,在循环中每次重复提取一行,所有的行都处理后,游标会自动关闭。
控制显式游标的四个命令里,CURSOR语句用于声明一个显式游标,定义参数。OPEN语句用于执行查询和为引用的变量赋值,如果查询没有返回行,PL/SQL不会产生异常。FETCH语句和INTO子句用于把当前行的值提取到变量中。在完成行的处理后,CLOSE语句会关闭游标,释放行的活动集合,游标关闭后可以重新打开并建立新的活动集合。
显式游标用于返回多于一行的查询,隐式游标会被隐式声明,用于所有的DML语句和SELECT语句,每一次只处理一行。隐式游标不能通过使用OPEN, FETCH, 和CLOSE语句控制。显式游标用于个别地处理查询返回的多行数据。
在PL/SQL的执行部分为一个记录赋值的语法:
record_name.field_name := expression;
高级显式游标概念
伴随FOR UPDATE子句一起使用的UPDATE 和 DELETE 语句中可以使用WHERE CURRENT OF 子句。WHERE CURRENT OF字句用于更新或删除当前行。FOR UPDATE OF子句会锁定被SELECT语句影响的行。
DECLARE
CURSOR inv_cursor (p_man_id NUMBER, p_name VARCHAR2)
IS SELECT id, name FROM inventory
WHERE manufacturer_id = p_man_id AND name = p_name;
如果你创建了一个带参数的游标,你可以在打开游标时传递值。要把值传递到游标INV_CURSOR,执行以下句子:OPEN inv_cursor (45094, 'Cable');
游标打开时,45094和‘Cable’会传递到参数P_MAN_ID和 P_NAME。
你可以在FROM子句中使用子查询来为查询创建一个数据源,这样的查询可以用作游标的数据源。
如果你声明游标时定义了一个带参数的游标,你必须指定指定参数的数据类型,但不用指定大小。处理例外
声明部分用于声明ORACLE服务器的非预定义异常和用户定义异常,俘获非预定义异常先要在声明部分声明异常的名称。语法:exception EXEPTION;
然后把声明的异常和标准的ORACLE服务器错误编号相关联,使用EXCEPTION_INIT语句,语法:PRAGMA EXCEPTION_INIT (exception,error_number);
俘获用户自定义异常,先要在声明部分声明用户自定义异常的名称,语法:
exception EXEPTION;
然后在执行部分,使用RAISE语句显式引发异常,语法:RAISE exception;
当一个子块处理异常后,它会正常结束,并且控制在封闭块(enclosing block)的子块END语句后恢复。如果PL/SQL引发了异常,而当前块没有该异常的处理程序,异常会在封闭块中传播,直到它找到一个处理程序。如果上述块均未处理该异常,这将会在主机环境中引起一个未处理异常。当异常传播到封闭块时,块的其余部分将被绕过。
一些预定义的异常:
NO_DATA_FOUND 单行SELECT查询没有返回数据。
TOO_MANY_ROWS 单行SELECT查询返回多行数据。
INCALID_CURSOR 发生非法游标操作。
ZERO_DIVIDE 试图被0除。
DUP_VAL_ON_INDEX 试图在具有唯一索引的字段中插入重复值。
WHEN OTHERS子句放置在所有其他异常处理自居的后面,用于所有未显示列出的异常。