Oracle11g 提高;“未插入/找到任何记录”;Insert语句中的异常

Oracle11g 提高;“未插入/找到任何记录”;Insert语句中的异常,oracle11g,Oracle11g,我在Oracle11g中有以下代码片段 BEGIN FOR LOOP IN (SELECT DISTINCT TIME_PERIOD FROM TABLEA) LOOP INSERT INTO TABLEB (SELECT SUBITEM, LOC FROM TABLEC WHERE TABLEC.ITEM = TABLEA.ITEM); END LOOP; END; 我想提出一个例外,对于特定的项,表C中没有子项,因此表B中

我在Oracle11g中有以下代码片段

BEGIN 
  FOR LOOP IN (SELECT DISTINCT TIME_PERIOD FROM TABLEA)
  LOOP
    INSERT INTO TABLEB 
      (SELECT SUBITEM, LOC 
       FROM TABLEC 
       WHERE TABLEC.ITEM = TABLEA.ITEM);
  END LOOP;
END;
我想提出一个例外,对于特定的项,表C中没有子项,因此表B中没有插入记录

块应验证特定项,如果子项存在,则插入数据,或者引发特定项的异常(将数据插入错误表中的用户定义异常),然后继续

p.S:我只想知道在FOR循环中在何处以及如何引发异常。不需要在错误表中插入代码

不想使用游标

非常感谢你的帮助


以下是我对这个问题的理解

因为您没有提供测试用例,所以我自己做了

SQL> create table tablea (item number, time_period number);

Table created.

SQL> create table tableb(subitem number, loc varchar2(20));

Table created.

SQL> create table tablec (item number, subitem number, loc varchar2(20));

Table created.

SQL> insert into tablea values (1, 1);

1 row created.

SQL> insert into tablec values (1, 1, 'a');

1 row created.
你发布的代码是无效的,所以-我修改了它,使它实际上做了一些事情
SQL%ROWCOUNT
返回受影响的行数,因此我正在检查
INSERT
是否插入了任何内容。如果没有,则引发错误并终止进一步执行

第一次执行成功,因为TABLEA和TABLEC中的项值都匹配:

SQL> begin
  2    for cur_r in (select distinct item, time_period from tablea) loop
  3      insert into tableb (subitem, loc)
  4        select c.subitem, c.loc
  5          from tablec c
  6          where c.item = cur_r.item;
  7
  8      if sql%rowcount = 0 then
  9         raise_application_error(-20000, 'Nothing has been inserted for TABLEA.ITEM = ' || cur_r.item);
 10      end if;
 11    end loop;
 12  end;
 13  /

PL/SQL procedure successfully completed.

SQL> select * from tableb;

   SUBITEM LOC
---------- --------------------
         1 a

SQL>
现在,让我们将ITEM=2插入TABLEA,TABLEA在TABLEC中没有一对,因此将引发一个错误:

SQL> insert into tablea values (2, 2);

1 row created.

SQL> begin
  2    for cur_r in (select distinct item, time_period from tablea) loop
  3      insert into tableb (subitem, loc)
  4        select c.subitem, c.loc
  5          from tablec c
  6          where c.item = cur_r.item;
  7
  8      if sql%rowcount = 0 then
  9         raise_application_error(-20000, 'Nothing has been inserted for TABLEA.ITEM = ' || cur_r.item);
 10      end if;
 11    end loop;
 12  end;
 13  /
begin
*
ERROR at line 1:
ORA-20000: Nothing has been inserted for TABLEA.ITEM = 2
ORA-06512: at line 9