PL/SQL Select into 异常处理
2015-12-21 19:26
295 查看
在使用select into 为变量赋值时,如果变量是集合类型,不会产生异常,而如果是基本类型或记录类型,则会报异常。
异常产生了怎么办?当然是捕获并处理啦。
对于普通的代码块来说,在代码块的结尾处理就可以了。
但是在循环里面呢?根据异常的传播,产生异常程序会中止。但如果想要在发生异常后,达到continue的效果,可不能在结尾的exception那里添加when others then continue;的语句,否则报错。
要达到在循环中,找不到数据就continue,可以在赋值时,no_data_found的情况下作异常处理。即是让赋值语句包含在begin exception end的结构中。
另外,记录类型不能被整体判断为空,可以修改某列的值来判断,或者使用一个标志变量判断。
下面是一个小例子,我们一起感受一下。
异常产生了怎么办?当然是捕获并处理啦。
对于普通的代码块来说,在代码块的结尾处理就可以了。
但是在循环里面呢?根据异常的传播,产生异常程序会中止。但如果想要在发生异常后,达到continue的效果,可不能在结尾的exception那里添加when others then continue;的语句,否则报错。
要达到在循环中,找不到数据就continue,可以在赋值时,no_data_found的情况下作异常处理。即是让赋值语句包含在begin exception end的结构中。
另外,记录类型不能被整体判断为空,可以修改某列的值来判断,或者使用一个标志变量判断。
下面是一个小例子,我们一起感受一下。
1 declare 2 v_test2 studentRecord;--遍历游标 3 v_test3 studentRecord;--每次取出的记录 4 cursor c_test is 5 select * 6 from student_head h 7 where h.student_key in (3285, 3286, 3287, 3288); 8 flag boolean; 9 begin 10 open c_test; 11 loop 12 fetch c_test into v_test2; 13 exit when c_test%notfound; 14 flag := true; 15 begin 16 select * 17 into v_test3 18 from student_head 19 where student_key = v_test2.student_key 20 and student_status <> 'CNX'; 21 exception 22 when no_data_found then--select into 没有数据时,如果是集合类型不会产生异常,记录类型报异常 23 flag := false; 24 end; 25 /*if v_test3 is null*/--记录类型不能整体判断为空 26 if flag then--判断是否有找到数据 27 dbms_output.put_line(v_test3.student_key || ' ' || v_test3.student_no); 28 end if; 29 end loop; 30 close c_test; 31 /*exception 32 when no_data_found then continue ;*/ -- 不能在异常中使用continue 33 -- 如果在此处理异常,会导致循环中止,要达到continue的效果,可在每次赋值进行异常处理 34 end;
相关文章推荐
- Mysql数据库主从同步配置操作详解(单向同步)
- PL/SQL 记录集合IS TABLE OF的使用
- PL/SQL 触发器简介
- plsql 显式游标
- ora-04021:等待锁定对象时发生超时
- PL/SQL 异常的传播
- pl/sql 自学软件安装及配置
- 数据库字段顺序的【坑】
- nvl函数
- Mysql 数据库zip版安装时basedir datadir 路径设置问题,避免转义符的影响
- mysql处理高并发,防止库存超卖
- SQL server数据缓存依赖
- 用ISO文件以YUM方式安装ORACLE12C所需要的RPM
- cmd 到数据库时出现ORA-01658: 无法为表空间 DHCT中的段创建 INITIAL 区
- 防止SQL注入
- 数据库事务(Transaction)的ACID特性解释
- 分析Redis架构设计
- LoadRunner调用Oracle存储过程
- redis 主从模式
- Sqlmap注入技巧集锦