我在PL / SQL块之下:
Begin
insert1();
insert2();
insert3();
procedureTest();
End
每个 insertTest 都会插入某些表格。
现在,如果其中一个过程不会插入任何内容,则不应执行 procedureTest 。
怎么做?
答案 0 :(得分:3)
您有两种可能性来检查三个过程是否插入行:
1)启动查询或调用函数以选择每次调用后预期插入的行数;
2)存储命令sql%rowcount
的结果:此命令返回受insert/update/delete
指令影响的行数。
注意,对于第二个选项,如果insert1/2/3
仅使用一个插入指令插入行,并且此单个插入是过程的最后一个语句,则可以调用{{ 1}}以下列方式调用sql%rowcount
之后:
insert1/2/3
相反,如果三个过程使用多个insert语句,或者在插入后执行select或任何其他指令,则必须检查 declare
ret NUMBER := 0;
Begin
insert1();
ret := sql%rowcount; -- counts rows inserted in insert1
insert2();
ret := ret + sql%rowcount; -- counts rows inserted in insert1 + insert2
insert3();
ret := ret + sql%rowcount; -- counts rows inserted in insert1 + insert2 + insert3
if ret > 0 then
procedureTest();
end if;
End
内的sql%rowcount
在每个insert语句之后立即返回这些结果的总和作为输出参数(如果insert1/2/3
是过程)或返回值(如果insert1/2/3
是函数)。
希望它有所帮助。
答案 1 :(得分:1)
从此
如果其中一个程序不会插入任何内容
我知道你想停止执行其余的代码。因此,对此,建议是:在那些函数insert1 / 2/3中,返回受影响的行数:
sql%rowcount
请注意,此函数计算受影响的行数,可以说,它只计算插入,更新和删除语句(非选择),对于select,您需要一个游标,您可以在此处找到更多信息:https://asktom.oracle.com/pls/apex/asktom.search?tag=rows-affected
然后,当这些函数返回一个值时,如果已插入任何内容将返回一个数字> 0,然后你可以存储一个变量并检查它们的值,如果其中任何一个是== 0,则返回,否则,执行procedureTest()。要中断执行,您可以使用return;
答案 2 :(得分:1)
一种方法是让您的insert1/2/3
过程返回作为OUT
参数插入的行数,然后您可以在调用过程中捕获并检查这些行。
declare
l_rowcount1 integer := 0;
l_rowcount2 integer := 0;
l_rowcount3 integer := 0;
l_rowcount_total integer := 0;
procedure insert1
( p_rowcount out integer )
is
begin
insert into sometable(a, b, c)
select x, y, z from somewhere
where whatever = somethingelse;
p_rowcount := sql%rowcount;
end insert1;
begin
insert1(l_rowcount1);
insert1(l_rowcount2);
insert1(l_rowcount3);
l_rowcount_total := l_rowcount1 + l_rowcount2 + l_rowcount3;
if l_rowcount_total > 0 then
do_something();
end if;
end;
答案 3 :(得分:0)
create or replace procedure insert1 is
o_error varchar2(150);
begin
-- your statement 1
exception when others then rollback; o_error := ' an error occured! '; raise_application_error(-20101,o_error);
end;
如前所述创建程序insert1
- 2
- 3
,在每个连续插入过程中将错误代码迭代为-20002
& -20003
和陈述2
& 3
。
并按照之前的方式调用返回的错误参数:
Begin
insert1;
insert2;
insert3;
procedureTest();
End
如果出现任何错误,您会将其视为提醒,并且您的计划部门将停止运行。