codememo

Oracle 예외 처리

tipmemo 2023. 8. 11. 21:49
반응형

Oracle 예외 처리

ORA-01400 오류를 처리해야 합니다("SCHEMA"에 NULL을 삽입할 수 없습니다).TABLE_NAME"."COLUMN_NAME")을(를) 사용합니다.

ORACESS는 (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;

미리 정의된 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

변수와 같이 사용자 자신의 예외를 정의할 수 있습니다(다른 변수와 범위가 같으므로 패키지 예외 등을 정의할 수 있습니다).):

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

다음과 같은 코드로 예외를 처리할 수 있습니다.

....
 ...
 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;   
 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

언급URL : https://stackoverflow.com/questions/1975290/handle-oracle-exceptions

반응형