我在一个主procedure中调用多个子procedure,如果其中一个子procedure报错,我希望能跳过去继续执行后面的子procedure,请问代码该如何写?
我的主procedure:
create or replace procedure test  is
v_sqlcode number;
v_sqlmsg varchar2(200):='';
begin
test1(v_sqlcode);
test2(v_sqlcode);
EXCEPTION
WHEN OTHERS THEN
  v_sqlcode := SQLCODE;
  v_sqlmsg := SQLERRM;
  ROLLBACK;
  Raise_application_error(-20000, v_sqlmsg);
end;test1:
create or replace procedure test1(v_sqlcode out number)  is
v_sqlmsg varchar2(200):='';
--v_sqlcode number(10):=0;
begin
insert into test values('tttttttt','4');
commit;
--错误信息
EXCEPTION
WHEN OTHERS THEN
  v_sqlcode := SQLCODE;
  v_sqlmsg := SQLERRM;
  ROLLBACK;
  Raise_application_error(-20000, v_sqlmsg);
end;
test2:
create or replace procedure test2(v_sqlcode out number)  is
v_sqlmsg varchar2(200):='';
--v_sqlcode number(10):=0;
begin
insert into xiazp_test values('t','4');
commit;
--错误信息
EXCEPTION
WHEN OTHERS THEN
  v_sqlcode := SQLCODE;
  v_sqlmsg := SQLERRM;
  ROLLBACK;
  Raise_application_error(-20000, v_sqlmsg);
end;table-test的第一个字段是varchar2(1),所以test1会报错。但我执行主procedure-test时,test1确实报错了,但test2也没有执行。请问该如何处理,谢谢!

解决方案 »

  1.   

    create or replace procedure test is
    v_sqlcode number;
    v_sqlmsg varchar2(200):='';
    begin
    begin
    test1(v_sqlcode);
    EXCEPTION
    WHEN OTHERS THEN
    null;
    end;
    begin
    test2(v_sqlcode);
    EXCEPTION
    WHEN OTHERS THEN
    null;
    end;
    EXCEPTION
    WHEN OTHERS THEN
      v_sqlcode := SQLCODE;
      v_sqlmsg := SQLERRM;
      ROLLBACK;
      Raise_application_error(-20000, v_sqlmsg);
    end;
      

  2.   


    create or replace procedure test is
      v_sqlcode number;
      v_sqlmsg  varchar2(200) := '';
    begin
      begin
        test1(v_sqlcode);
      EXCEPTION
        WHEN OTHERS THEN
          Raise_application_error(-20001, v_sqlmsg);------多加几个begin ... end 就可以了。。
      end;
      begin
        test2(v_sqlcode);
      EXCEPTION
        WHEN OTHERS THEN
          Raise_application_error(-20002, v_sqlmsg);
      end;
    EXCEPTION
      WHEN OTHERS THEN
        v_sqlcode := SQLCODE;
        v_sqlmsg  := SQLERRM;
        ROLLBACK;
        Raise_application_error(-20000, v_sqlmsg);
    end;
      

  3.   

    null;
    改成
    dbms_output.put_line(sqlcode||'  '||sqlerrm);
      

  4.   

    可以在被调用的过程里写exception  when others then
    做处理,吃掉exception
      

  5.   

    我在程序里处理不想要的异常时,就用try{}catch(e){}
    catch里边不做任何处理就行了
      

  6.   

    我将procedure-test改成这样,仍旧没有跳过test1执行test2:
    create or replace procedure test  is
    v_sqlcode number;
    v_sqlmsg varchar2(200):='';
    begin
    begin
      test1(v_sqlcode);
      EXCEPTION
        WHEN OTHERS THEN
          ROLLBACK;
          Raise_application_error(-20001, SQLERRM);------多加几个begin ... end 就可以了。。
      end;
      begin
        test2(v_sqlcode);
      EXCEPTION
        WHEN OTHERS THEN
          ROLLBACK;
          Raise_application_error(-20001, SQLERRM);------多加几个begin ... end 就可以了。。
      end;EXCEPTION
    WHEN OTHERS THEN
      v_sqlcode := SQLCODE;
      v_sqlmsg := SQLERRM;
      ROLLBACK;
      Raise_application_error(-20000, v_sqlmsg);
    end;
      

  7.   

     Raise_application_error(-20001, SQLERRM);把这个修改成别的正常的语句,不要把异常抛出来