2014년 1월 14일 화요일

(ORACLE PLSQL)오라클 EXCEPTION으로 CATCH(ORA-00942, ORA-06550, "table or view does not exist")

(ORACLE PLSQL)오라클 EXCEPTION으로 CATCH(ORA-00942, ORA-06550, "table or view does not exist")

create or replace procedure deleteTable
is
notfoundtable                EXCEPTION;
    PRAGMA EXCEPTION_INIT  (notfoundtable, -942);
BEGIN
          DELETE FROM onj;
EXCEPTION
          WHEN notfoundtable THEN NULL;
    DBMS_OUTPUT.PUT_LINE(SQLCODE ||  ' ** '  || SQLERRM);
END;
/

[오류 메시지]

DELETE FROM ex1;
                      *
ERROR at line 10:
ORA-06550: line 10, column 23:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 10, column 11:
PL/SQL: SQL Statement ignored


위 오류는 컴파일 시점에 발생하는 오류이기 때문에 EXCEPTION절로 잡을 수가 없다.
이를 잡아내기 위해서는 동적SQL로 만들어 런타임 오류로 잡아야 한다.
PL/SQL EXCEPTION구문으로 잡을 수 있는것은 런타임 오류임을 명심하자.



[해결방법]

SQL> create or replace procedure deleteTable
    is
        notfoundtable          EXCEPTION;
        PRAGMA EXCEPTION_INIT  (notfoundtable, -942);
    BEGIN
              --DELETE FROM onj;
            EXECUTE IMMEDIATE 'DELETE FROM onj';
    EXCEPTION
        WHEN notfoundtable THEN NULL;
      DBMS_OUTPUT.PUT_LINE(SQLCODE ||  ' ** '  || SQLERRM);
 10  END;
 11  /

Procedure created.

SQL> exec DELETEONJ;

PL/SQL procedure successfully completed.

SQL> set serveroutput on
SQL> exec DELETEONJ;
-942 ** ORA-00942: table or view does not exist 

댓글 없음:

댓글 쓰기