【问题标题】:Handle ORACLE Exceptions处理 ORACLE 异常
【发布时间】:2010-12-30 19:46:27
【问题描述】:

我需要使用异常句柄处理 ORA-01400 error(不能将 NULL 插入 ("SCHEMA"."TABLE_NAME"."COLUMN_NAME") )。

ORACLE 预定义了一些异常,例如(ACCESS_INTO_NULL、ZERO_DIVIDE 等),但显然没有为 ORA-01400 错误定义异常,我该如何处理这个特定的错误代码?

我需要这样的东西(接受其他建议)。

....
 ...     
 INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName);
 COMMIT;
   EXCEPTION
     WHEN NULL_VALUES THEN /* i don't know this value , exist?*/
       Do_MyStuff();
     WHEN OTHERS THEN
       raise_application_error(SQLCODE,MY_OWN_FORMAT_EXCEPTION(SQLCODE,SQLERRM),TRUE); 
    END;

【问题讨论】:

    标签: oracle exception-handling plsql ora-01400


    【解决方案1】:

    预定义的 PL/SQL 异常对于 Oracle 来说是特殊的。你真的不能惹那些。当您想要拥有一组自己的预定义异常时,您不能像标准异常那样“全局”声明它们。相反,创建一个包含所有异常声明的 exceptions 包,并在您的 应用程序 代码中使用它。

    例子:

    CREATE OR REPLACE PACKAGE my_exceptions
    AS
      insert_null_into_notnull EXCEPTION;
      PRAGMA EXCEPTION_INIT(insert_null_into_notnull, -1400);
    
      update_null_to_notnull EXCEPTION;
      PRAGMA EXCEPTION_INIT(update_null_to_notnull, -1407);
    END my_exceptions;
    /
    

    现在使用包中定义的异常

    CREATE OR REPLACE PROCEDURE use_an_exception AS
    BEGIN
      -- application specific code ...
      NULL;
    EXCEPTION
      WHEN my_exceptions.insert_null_into_notnull THEN
         -- application specific handling for ORA-01400: cannot insert NULL into (%s)
         RAISE;
    END;
    /
    

    来源:http://www.orafaq.com/wiki/Exception

    【讨论】:

      【解决方案2】:

      您可以通过如下代码处理异常:

      ....
       ...
       INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName);   
       COMMIT;   
         EXCEPTION   
           WHEN OTHERS THEN   
             IF SQLCODE = -1400 THEN
               Do_MyStuff();
             ELSE
               raise_application_error(SQLCODE,MY_OWN_FORMAT_EXCEPTION(SQLCODE,SQLERRM),TRUE);
             END IF;
          END;   
      

      【讨论】:

        【解决方案3】:

        您可以定义自己的异常,例如变量(它们将与其他变量具有相同的范围,因此您可以定义包异常等...):

        SQL> DECLARE
          2     NULL_VALUES EXCEPTION;
          3     PRAGMA EXCEPTION_INIT(NULL_VALUES, -1400);
          4  BEGIN
          5     INSERT INTO t VALUES (NULL);
          6  EXCEPTION
          7     WHEN null_values THEN
          8        dbms_output.put_line('null value not authorized');
          9  END;
         10  /
        
        null value not authorized
        
        PL/SQL procedure successfully completed
        

        【讨论】:

        • Vincent,我已经知道了,这个解决方案的问题是我需要为每个特定的表定义一个异常。我正在寻找一种方法来为我的架构中的任何表提供服务。
        • 创建架构级触发器,以处理此自定义异常
        • @RRUZ:我不太明白,您可以将此异常用于任何表。如果您在包头中定义它,则可以在任何地方使用它(即:它将完全像预定义的 oracle 异常)
        • 我认为缺少的部分是检查 SQLERRM 以找到导致异常的表/列。
        • @Adam,我对导致异常的表/列不感兴趣,只是我需要像 ORACLE 那样处理这个特定的异常。
        【解决方案4】:
         INSERT INTO MY_TABLE (CODE, NAME) VALUES (aCode,aName);
         COMMIT;  
        
              EXCEPTION
                 WHEN NULL_VALUES /* i don't know this value , exist?*/
                   emesg := SQLERRM;
                   dbms_output.put_line(emesg); 
                 WHEN OTHERS THEN
                   emesg := SQLERRM;
                   dbms_output.put_line(emesg);
                 END;
        

        SQLERRM 显示 sql 错误信息

        http://www.psoug.org/reference/exception_handling.html

        【讨论】:

          猜你喜欢
          • 2018-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多