检查过程的执行(PL/SQL,Oracle)
Checking execution of procedure (PL/SQL, Oracle)
我有下面的PL/SQL块:
Begin
insert1();
insert2();
insert3();
procedureTest();
End
每个 insertTest 正在对某些表进行插入。
现在,如果此过程之一不会插入任何内容,我的 procedureTest 不应执行。
怎么做?
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
通过在每个连续的插入过程中将错误代码迭代 1 作为 -20002
& -20003
,和语句 2
& 3
。
然后像以前一样使用返回的错误参数调用:
Begin
insert1;
insert2;
insert3;
procedureTest();
End
如果出现任何错误,您会将其视为警报并且您的程序单元将停止 运行。
由此
if one of this procedure will not insert anything
我了解到您想停止执行其余代码。因此,为此,建议是:在这些函数中 insert1/2/3、return 受影响的行数:
sql%rowcount
请注意,此函数计算受影响的行数,可以说,它仅计算插入、更新和删除语句(而不是 select),对于 select,您会需要光标,您可以在此处找到更多信息:https://asktom.oracle.com/pls/apex/asktom.search?tag=rows-affected
然后,作为那些函数 return 一个值,如果已插入任何内容,将 return 一个大于 0 的数字,然后您可以将其存储在一个变量中并检查它们的值,如果有的话then is == 0,则return,否则,执行procedureTest()。要中断执行,可以使用return;
您有两种可能性来检查这三个过程是否插入行:
1) 启动查询或调用函数以 select 每次调用后预期插入的行数;
2) 存储命令 sql%rowcount
的结果:此命令 returns 受前面 insert/update/delete
指令影响的行数。
注意对于第二个选项,如果insert1/2/3
仅使用一个插入指令插入行并且这个插入是过程的最后一条语句,那么您可以通过以下方式在调用 insert1/2/3
之后调用 sql%rowcount
:
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
相反,如果三个过程分别使用多个插入语句或在插入后执行 select 或任何其他指令,则必须检查 sql%rowcount
inside insert1/2/3
紧跟在每个插入语句之后 return 这些结果的总和作为输出参数(如果 insert1/2/3
是过程)或作为 return 值(如果 insert1/2/3
是函数)。
希望对您有所帮助。
一种方法是让您的 insert1/2/3
过程 return 插入的行数作为 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;
我有下面的PL/SQL块:
Begin
insert1();
insert2();
insert3();
procedureTest();
End
每个 insertTest 正在对某些表进行插入。
现在,如果此过程之一不会插入任何内容,我的 procedureTest 不应执行。
怎么做?
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
通过在每个连续的插入过程中将错误代码迭代 1 作为 -20002
& -20003
,和语句 2
& 3
。
然后像以前一样使用返回的错误参数调用:
Begin
insert1;
insert2;
insert3;
procedureTest();
End
如果出现任何错误,您会将其视为警报并且您的程序单元将停止 运行。
由此
if one of this procedure will not insert anything
我了解到您想停止执行其余代码。因此,为此,建议是:在这些函数中 insert1/2/3、return 受影响的行数:
sql%rowcount
请注意,此函数计算受影响的行数,可以说,它仅计算插入、更新和删除语句(而不是 select),对于 select,您会需要光标,您可以在此处找到更多信息:https://asktom.oracle.com/pls/apex/asktom.search?tag=rows-affected
然后,作为那些函数 return 一个值,如果已插入任何内容,将 return 一个大于 0 的数字,然后您可以将其存储在一个变量中并检查它们的值,如果有的话then is == 0,则return,否则,执行procedureTest()。要中断执行,可以使用return;
您有两种可能性来检查这三个过程是否插入行:
1) 启动查询或调用函数以 select 每次调用后预期插入的行数;
2) 存储命令 sql%rowcount
的结果:此命令 returns 受前面 insert/update/delete
指令影响的行数。
注意对于第二个选项,如果insert1/2/3
仅使用一个插入指令插入行并且这个插入是过程的最后一条语句,那么您可以通过以下方式在调用 insert1/2/3
之后调用 sql%rowcount
:
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
相反,如果三个过程分别使用多个插入语句或在插入后执行 select 或任何其他指令,则必须检查 sql%rowcount
inside insert1/2/3
紧跟在每个插入语句之后 return 这些结果的总和作为输出参数(如果 insert1/2/3
是过程)或作为 return 值(如果 insert1/2/3
是函数)。
希望对您有所帮助。
一种方法是让您的 insert1/2/3
过程 return 插入的行数作为 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;