10

我需要使用异常句柄处理ORA-01400 错误(无法将 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;
4

4 回答 4

14

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

例子:

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

于 2009-12-29T19:01:23.937 回答
3

您可以通过其代码处理异常,如下所示:

....
 ...
 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;   
于 2009-12-29T16:07:21.357 回答
2

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

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
于 2009-12-29T15:56:36.870 回答
-1
 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

于 2009-12-29T16:14:22.020 回答