首页 新闻 会员 周边

请教各位大佬执行不走SQL%NOTFOUND是什么原因

0
[已解决问题] 解决于 2018-05-08 11:14

对于这个,找不到数据他直接就异常了,表面上看好像也没问题,走异常也能理解,以下是我的测试存过

create or replace procedure p_test_exception(i_prm varchar2)
as
v_username varchar2(10);
begin
  select a.uname into v_username from t_test_staff1 a
  where a.staffid=i_prm
  ;
  if SQL%NOTFOUND then
    insert into t_test_staff1(staffid) values (i_prm);
  end if;
  commit;
  end ;

海月孤影的主页 海月孤影 | 初学一级 | 园豆:46
提问于:2018-05-08 10:20
< >
分享
最佳答案
0

需要采用捕获no_data_found异常的方式

exception
  when no_data_found

详见 https://stackoverflow.com/a/13075674/5989202

奖励园豆:5
dudu | 高人七级 |园豆:30994 | 2018-05-08 10:49

你这个是另一个处理方式了,我那个可以不走异常就执行下去的,我只是不清楚为啥我那个不走sql%

海月孤影 | 园豆:46 (初学一级) | 2018-05-08 10:53

@海月孤影: %FOUND只对 INSERT, UPDATE, DELETE,SELECT INTO有效,对 SELECT 无效

%NOTFOUND
This attribute is the logical opposite of %FOUND. It yields TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise, it yields FALSE.

dudu | 园豆:30994 (高人七级) | 2018-05-08 11:10

@dudu: 好吧,被游标误导了,结果误打误撞在游标写更新语句了

海月孤影 | 园豆:46 (初学一级) | 2018-05-08 11:14
其他回答(1)
0

查了他的用法,看到有些网友提到了游标,我猜想应该是要在游标环境下才会走它,然后改了试试,然后真走了,下面是修改后的存过

create or replace procedure p_test_exception(i_prm varchar2)
as
v_username varchar2(10);
v_uname varchar2(10);
v_staffid varchar2(10);
 CURSOR c_staff IS
    SELECT a.staffid,a.uname
      FROM t_test_staff1 a
    ;
begin
  OPEN c_staff;
    LOOP
      FETCH c_staff INTO
      v_staffid,v_uname;
      EXIT WHEN c_staff%NOTFOUND;
  update t_test_staff1 a
  set a.uname=333333
  where a.staffid=i_prm
  ;
  if SQL%NOTFOUND then
    insert into t_test_staff1(staffid) values (i_prm);
  end if;
  commit;
  end loop;
  end ;

海月孤影 | 园豆:46 (初学一级) | 2018-05-08 11:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册