检查过程的执行(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;