代码之家  ›  专栏  ›  技术社区  ›  RRUZ

处理Oracle异常

  •  8
  • RRUZ  · 技术社区  · 15 年前

    我需要处理 ORA-01400 error (不能使用异常句柄将空值插入(“schema”.“table\u name”.“column\u 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;
    
    4 回复  |  直到 13 年前
        1
  •  13
  •   No AI now No AI ever    15 年前

    预定义的pl/sql异常是 特殊的 对甲骨文。你真的不能把这些搞乱。当您想拥有自己的一组预先定义的异常时,您不能像标准异常那样“全局”地声明它们。相反,创建一个 例外情况 包含所有异常声明并在 应用 代码。

    例子:

    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
  •  3
  •   Egor Rogov    15 年前

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

    ....
     ...
     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
  •  2
  •   Vincent Malgrat    15 年前

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

    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
    
        4
  •  -1
  •   Gerard Banasig    15 年前
     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;
    

    sqlerm显示SQL错误消息

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