2014-05-22 1 views
0

나는 오전 내가 두꺼비의 메시지를 볼 때 PL/SQL 기능PL/SQL 오라클 ORA-24344

Warning: compiled but with compilation errors 
No errors. 

를 만들 때 다음, 나는 다음을 참조하십시오

[Warning] ORA-24344: success with compilation error 
17/43 PL/SQL: ORA-00904: "PAGE_DCPN": invalid identifier 
2/48 PLS-00201: identifier 'B2BOWNER.SSC_PAGE_MAP' must be declared 
16/5 PL/SQL: SQL Statement ignored 
PL/SQL: Compilation unit analysis terminated 
(2: 0): Warning: compiled but with compilation errors 

를 수신하고 테이블을 만들려면 다음 PL/SQL 명령을 사용하여

DECLARE 

v_create LONG; 

v_drop LONG; 

TABLE_DOES_NOT_EXIST exception; 
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942 

TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map'; 

BEGIN 

    BEGIN 

     v_drop := 'DROP TABLE ' || TABLE_NAME; 

     EXECUTE IMMEDIATE v_drop; 

     EXCEPTION 

      WHEN TABLE_DOES_NOT_EXIST THEN NULL; 

    END; 

    v_create := 'CREATE TABLE ' || TABLE_NAME || ' (
       PAGE_ID_NBR NUMERIC(10) NOT NULL Check(Page_ID_NBR > 0), 
       PAGE_TYPE  VARCHAR2(50) NOT NULL, 
       PAGE_DCPN  VARCHAR2(100) NOT NULL, 
       PRIMARY KEY(Page_ID_NBR, Page_Type))'; 

    EXECUTE IMMEDIATE v_create; 

    COMMIT WORK; 

    COMMIT COMMENT 'Create Table'; 

    EXCEPTION 

     WHEN OTHERS THEN 

     IF SQLCODE = -955 THEN 

      NULL; -- suppresses ORA-00955 exception 
     ELSE 

      RAISE; 
     END IF; 

END; 

내가 만들려고 오전 PL/SQL 기능은

0 스크립트를 생성
CREATE OR REPLACE FUNCTION B2BOWNER.F_SSC_Page_Map_Insert(
          p_page_id IN B2BOWNER.SSC_Page_Map.PAGE_ID_NBR%TYPE, 
          p_page_type IN B2BOWNER.SSC_Page_Map.PAGE_TYPE%TYPE, 
          p_page_dcpn IN B2BOWNER.SSC_Page_Map.PAGE_DCPN%TYPE) 

     RETURN INTEGER 

IS 

TABLE_DOES_NOT_EXIST exception; 
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942 

BEGIN 


MERGE INTO B2BOWNER.SSC_PAGE_MAP 
USING (SELECT PAGE_ID_NBR ,PAGE_TYPE ,PAGE_DCPN FROM dual) 
ON (PAGE_ID_NBR = p_page_id AND PAGE_TYPE = p_page_type AND PAGE_DCPN = p_page_dcpn) 
WHEN MATCHED THEN 
    UPDATE SET PAGE_ID_NBR = p_page_id, PAGE_TYPE = p_page_type, PAGE_DCPN = p_page_dcpn 
WHEN NOT MATCHED THEN 
    INSERT (PAGR_ID_NBR, PAGE_TYPE, PAGE_DCPN) 
    VALUES(p_page_id, p_page_type, p_page_dcpn); 


RETURN 0; 

EXCEPTION 

    WHEN TABLE_DOES_NOT_EXIST THEN 

     RETURN -1; 

    WHEN DUP_VAL_ON_INDEX THEN 

     RETURN -2; 

    WHEN INVALID_NUMBER THEN 

     RETURN -3; 

    WHEN OTHERS THEN 

     RETURN -4; 

END F_SSC_Page_Map_Insert; 

SHOW ERRORS PROCEDURE B2BOWNER.F_SSC_Page_Map_Insert; 

GRANT EXECUTE ON F_SSC_Page_Map_Insert TO B2B_USER_DBROLE; 

PL/SQL은 일반적인

PL/SQL procedure successfully completed. 

과 성공을 실행하고 기존과 같은 스키마 B2BOWNER.SSC_PAGE_MAP에서 두꺼비에 확인하고 모두가 좋아 보인다.

here과 같은 절차를 사용하는 것이 처음이므로 절차 중 어떤 부분이 분명하지는 않지만 내 문제가있는 곳이있을 수 있습니다.

답변

0

적어도 F_SSC_Page_Map_Insert 함수에서 ORA-00942 오류를 catch 할 수 없습니다. 함수가 작성 될 때 테이블이 존재하지 않으면 함수가 작성 될 때 테이블에 대한 정적 참조가 존재하지 않으므로 함수가 컴파일되지 않습니다. PL/SQL 블록에서 컴파일 오류를 catch 할 수는 없으며 런타임 오류 만 catch 할 수 있습니다.

테이블을 참조하기 위해 동적 SQL 만 사용하는 함수를 수정할 수도 있습니다. 이는 컴파일러가 컴파일시보다 런타임에 대한 객체 참조를 지연시켜 함수에서 예외를 잡을 수있게합니다. 이는 테이블이 존재하지 않을 때 함수가 성공적으로 컴파일되도록합니다. 물론, 그렇게하면 함수가 더 복잡 해지고, 작성하기가 어려워지고, 읽기가 어렵고, 디버그하기가 어려워집니다. 그것은 또한 거의 확실하게 약간의 성능 벌칙을 부과 할 것이다.

테이블이 존재하기 전에 프로 시저를 만들어야하는 이유가 있습니까? 일반적으로 필요하지 않은 복잡성입니다. 따라서 코드를 추가하기보다는 복잡성을 피해야합니다.

+0

그런 이유로 ORA-24344가 발생합니까? – Mushy

+0

@ 무시 - 네 것처럼 보일 것입니다. –

+0

그렇다면 함수가 만들어 질 때까지 코드 줄을 주석 처리해야합니까? 그거 제안 해 줄래? – Mushy

관련 문제