PL/SQL Select into 异常处理

在使用select into 为变量赋值时,如果变量是集合类型,不会产生异常,而如果是基本类型或记录类型,则会报异常。

异常产生了怎么办?当然是捕获并处理啦。

对于普通的代码块来说,在代码块的结尾处理就可以了。

但是在循环里面呢?根据异常的传播,产生异常程序会中止。但如果想要在发生异常后,达到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;

 

转载于:https://www.cnblogs.com/kingsleylam/p/3284369.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值