|
|
高级显式游标概念
伴随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子句放置在所有其他异常处理自居的后面,用于所有未显示列出的异常。 |
|