【问题标题】:Try Catch Like Exception Handling In Pl/Sql在 Pl/Sql 中尝试 Catch 之类的异常处理
【发布时间】:2012-09-13 16:44:54
【问题描述】:

在一个程序中,我想做逻辑单元1,失败也没关系,执行逻辑单元2

这似乎是一个典型的 try-catch 场景。但我怎么能在 pl/sql 中做到这一点?

create or replace
PACKAGE BUILD_PKG
AS
PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name   IN VARCHAR2,
    p_table_name IN VARCHAR2 );
END BUILD_PKG;
/
create or replace
PACKAGE BODY  BUILD_PKG
AS
BEGIN
PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name   IN VARCHAR2,
    p_table_name IN VARCHAR2 )
 IS
   l_val NUMBER;
 BEGIN
   BEGIN
     EXECUTE immediate 'truncate table ' || p_table_name;
   EXCEPTION 
        WHEN OTHERS 
        THEN dbms_output.put_line(SQLCODE);
   END;

   BEGIN
     EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
   EXCEPTION 
        WHEN OTHERS 
        THEN dbms_output.put_line(SQLCODE);
   END; 
 END reset_seq_and_truncate_tbl;

END BUILD_PKG;

如您所见,第二个异常块导致了问题。

【问题讨论】:

    标签: plsql


    【解决方案1】:

    程序 ( ) 是

    开始

    -- 逻辑单元1 开始 ... 例外 当其他人 然后 ... 结束;

    -- 逻辑单元2 开始 ... 例外 当其他人 然后 ... 结尾;

    -- 最终异常块 例外 当其他人 那么...

    结束;

    【讨论】:

      【解决方案2】:

      将第二个EXCEPTION 括在BEGIN..END 块中。试试这个方法

      PROCEDURE reset_seq_and_truncate_tbl(
          p_seq_name   IN VARCHAR2,
          p_table_name IN VARCHAR2 )
       IS
         l_val NUMBER;
       BEGIN
         EXECUTE immediate 'truncate table ' || p_table_name;
       EXCEPTION 
            WHEN OTHERS 
            THEN
            BEGIN
              dbms_output.put_line(SQLCODE);
              EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
             --this would cause compilation error
             EXCEPTION 
                  WHEN OTHERS 
                  THEN dbms_output.put_line(SQLCODE);
           END; 
       END reset_seq_and_truncate_tbl;
      

      更新以回应评论

      PROCEDURE reset_seq_and_truncate_tbl(
          p_seq_name   IN VARCHAR2,
          p_table_name IN VARCHAR2 )
       IS
         l_val NUMBER;
       BEGIN
         BEGIN
           EXECUTE immediate 'truncate table ' || p_table_name;
         EXCEPTION 
              WHEN OTHERS 
              THEN dbms_output.put_line(SQLCODE);
         END;
      
         BEGIN
           EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
         EXCEPTION 
              WHEN OTHERS 
              THEN dbms_output.put_line(SQLCODE);
         END; 
       END reset_seq_and_truncate_tbl;
      

      【讨论】:

      • 几乎完全符合我的回答。我会删除我的。
      • 对不起,我应该说得更清楚。执行逻辑1,失败无所谓,执行逻辑2
      • 看看第二种方法
      • 我假设某些 pl/sq 代码可能在第二条指令之后,即使第二条指令失败也必须执行。
      • 即使程序是软件包的一部分,它也可以正常工作。您唯一需要做的就是删除包体规范中的第一个 BEGIN。
      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多