首页 > 解决方案 > 在插入语句中引发“未插入/找到记录”异常

问题描述

我在 ORACLE 11G 中有以下代码片段

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 中没有插入记录时,我想引发异常。

块应验证特定项目,如果子项目存在则插入数据,否则引发特定项目的异常(用户定义的异常,其中数据被插入到错误表中)并继续前进。

PS:我只想知道我应该在哪里以及如何在 FOR 循环中引发异常。不需要将代码插入错误表。

不想使用游标。

非常感谢您的帮助。!


标签: oracle11g

解决方案


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

由于您没有提供测试用例,我自己做了。

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 中的 ITEM 值之间存在匹配:

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 中,它在 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

推荐阅读