检查程序的执行(PL / SQL,Oracle)

时间:2018-01-22 12:06:14

标签: sql oracle plsql procedure oracle12c

我在PL / SQL块之下:

Begin
   insert1();
   insert2();
   insert3();

   procedureTest();    
End

每个 insertTest 都会插入某些表格。

现在,如果其中一个过程不会插入任何内容,则不应执行 procedureTest

怎么做?

4 个答案:

答案 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

如果出现任何错误,您会将其视为提醒,并且您的计划部门将停止运行。