PL/SQL学习笔记-3

PL/SQL学习笔记-3

第6章到第7章

[@more@]

第6章 游标

6.1 什么是游标
为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区。
这个区包含了完成处理过程的必要信息,其中包括已经处理完的行数、指向被分析语句的指针和在查询情况下的活动集,它是查询语句返回的数据行集。
游标是指向上下文区的句柄或者指针。

处理显示游标的步骤
1.声明游标
CURSOR cursor_name IS select_statement;
游标声明也可以引用PL/SQL变量。但必须在这之前声明。

2.打开游标
OPEN cursor_name;
当游标打开时:
* 检验绑定变量的值
* 基于的绑定变量的值和查询中所使用的表的内容,确定活动集
* 活动集指针指向第一行

3.用游标检索值
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;

4.关闭游标
CLOSE cursor_name;

5.游标属性
%FOUND、%NOTFOUND、%ISOPEN、%ROWCOUNT、%BULK_ROWCOUNT(Oralce8i之后)

处理隐式游标
在PL/SQL中直接运行sql,会调用隐式游标,可以用SQL%FOUND SQL%NOTFOUNT SQL%ISOPEN SQL%ROWCOUNT SQL%BULK_ROWCOUNT

6.2 游标检索循环

简单循环
OPEN c_xxx
LOOP
FETCH cxxx INTO xxx
EXIT WHEN c_xxx%NOTFOUND;
ENDLOOP

WHILE循环
OPEN cursor_name;
FETCH cursor_name INTO xxx;
WHILE cursor_name%FOUND LOOP
...
FETCH cursor_name INTO xxx;
END LOOP;
CLOSE cursor_name;

游标FOR循环:
FOR v_xxx IN ('xxx') LOOP
...
END LOOP;

NO_DATA_FOUND异常只有当SELECT...INTO语句的WHERE子句没有匹配任何数据行时出现。
当显式游标的WHERE子句不匹配任何数据行时,则%NOTFOUND被设置为TRUE。
UPDAT或者DELETE语句的WHERE子句不匹配任何数据行时,则%NOTFOUND被设置为TRUE。而不出现NO_DATA_FOUND。

FOR UPDATE
SELECT ... FROM ... FOR UPDATE[ OF column_reference ][ NOWAIT|WAIT n ]
n为要等待的秒数。

WHERE CURRENT OF
可以使用 WHEN CURRENT OF cursor_name 来更新当前记录,但是游标中的SELECT必须要有FOR UPDATE。

通过提交检索
COMMIT会释放该会话所所拥有的任何锁。因为FOR UPDATE 需要锁,当释放锁之后,游标就无效了。之后的检索就都无效了。
所以不要在FOR UPDATE的游标循环里面使用COMMIT。
即时没有用for update,在循环中使用commit,则可能会出现 ORA-1555:snapshot too old 这样的错误。
如果要不使用for update 来更新记录,可以用 where id=v_xx.id 的方法,如果没有主键的话,可以考虑用rowid。


6.3 游标变量
引用类型的声明: REF type
声明游标变量: TYPE type_name IS REF CURSOR [RETURN return_type]
有RETURN参数的是约束游标变量,否则是无约束游标变量。
打开游标 OPEN cursor variable FOR select_statement;

DECLARE
TYPE emp_cur_typ IS CURSOR;
emp_cur emp_cur_typ;
v_stmt VARCHAR2(200);
BEGIN
v_stmt := 'SELECT * FROM table_name';
OPEN emp_cur FOR v_stmt;
...
...
END;


第7章 错误处理
当某错误出现时,某异常将被抛出。此时控制权将会被传递给异常处理器。
用户自定义异常:
DECLARE
e_TooManyStudents EXCEPTION;
预定义异常:
NO_DATA_FOUND ZERO_DIVIDE INVALID_NUMBER ...

抛出异常
通过RAISE语句,用户自定义异常可以被显式抛出。
处理异常
EXCPETION
WHEN exception_name [or xxxxx] THEN
sequence_of_statements1;
[WHEN OTHERS THEN
sequence_of_statements3;]
END;

某给定异常最多由异常部分的一个处理器进行处理。如果某异常有多个处理器,则PL/SQL编译器将产生PLS-483错误。
PL/SQL定义了一个特殊的异常处理器,即WHEN OTHERS。
SQLERRM可以带参数使用 SQLERRM(参数) 此参数为负值,唯一例外为SQLERRM(100)。
注意SQLCODE和SQLERRM的值先赋给本地变量,然后才用于SQL语句中。因为这些函数是过程化的,所以不能直接用于SQL语句。

可以把某命名异常同某特定Oracle错误关联起来。这将使你能捕获这种特定错误,而不是通过OTHERS处理器。
PRAGMA EXCEPTION_INIT(exception_name,oracle_error_number);

RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
error_number 是一个在-20000和-20999之间的值

7.2 异常传播
如果在声明部分某赋值产生了异常,该异常被立即传播到外层语句块,即使在当前语句快有一个处理器,也不会被执行。

7.3 异常准则

7.4 通用错误处理器
可以考虑利用 DBMS_UTILITY.FORMAT_CALL_STACK 和 DBMS_UTILITY.FORMAT_ERROR_STACK 函数制作一个通用错误处理器。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133835/viewspace-919229/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133835/viewspace-919229/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值