oracle11g - 在插入语句中引发“未插入/找到记录”异常
问题描述
我在 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 循环中引发异常。不需要将代码插入错误表。
不想使用游标。
非常感谢您的帮助。!
解决方案
以下是我对这个问题的理解。
由于您没有提供测试用例,我自己做了。
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
推荐阅读
- c# - 在c#中是否有一种方法可以通过字符串转换子类的实例?
- python - 访问列表中字典的值,然后很好地打印它们
- jenkins - 如何识别 cron 计划何时触发了多分支作业?
- python - 将准备好的 JSONB 对象插入 postgres 时出现 psycopg2 问题
- python - 建立一个基于另一个列
- sql - 为什么这条 SQL 语句这么快?
- c# - Unity PlayerPrefs 没有更新我的“高分”
- css - 中心导航栏品牌和右拉“帮助”图标
- python - 如何打印特定级别的所有节点?
- reactjs - 如何在我的 JS 应用程序中为 Google Drive 文件夹创建搜索栏?