2012-01-13 5 views
0

이 코드를 실행하는 데 문제가 있습니다. 그것은 트리거가 컴파일 오류로 생성되었지만 잘못된 점을 설명하지 않으며 출력을 제공하지 않는다고 말합니다. 아래 코드와 제가 주어진 오류입니다. 나는 Oracle 11g R1을 사용 중이며 PL/SQL을 사용하고 있습니다.SQL - Oracle 11g - PL/SQL - 트리거 컴파일 오류

CREATE OR REPLACE TRIGGER checkRecommendedAge 
BEFORE INSERT OR UPDATE ON Loan 
FOR EACH ROW 
DECLARE 
    borAge number; 
    ex  exception; 

BEGIN 
    SELECT count(*) INTO borAge 
    FROM Loan 
    WHERE dateOut =: new.dateOut; 
    IF borAge < 18 THEN 
     dbms.output.put_line('Row added to Book table succesful'); 
    ELSE 
     raise ex; 
    END IF; 

    EXCEPTION 
    WHEN EX THEN 
    raise_application_error("Error"); 
END; 
/

오류 :

Warning: Trigger created with compilation errors. 

SQL> SHOW ERRORS 
Errors for TRIGGER CHECKRECOMMENDEDAGE: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
0/0  PLS-00801: internal error [ph2csql_strdef_to_diana:bind] 
6/2  PL/SQL: SQL Statement ignored 
7/7  PL/SQL: ORA-06544: PL/SQL: internal error, arguments: 
     [ph2csql_strdef_to_diana:bind], [], [], [], [], [], [], [] 

10/3  PL/SQL: Statement ignored 
10/3  PLS-00201: identifier 'DBMS.OUTPUT' must be declared 
17/2  PL/SQL: Statement ignored 
17/27 PLS-00201: identifier 'Error' must be declared 

어떤 도움을 주시면 감사하겠습니다

감사

EXIT있어
+0

컴파일 후에 'SHOW ERRORS'을 발행 해보십시오. – Chandu

+0

@Cybernate 안녕하세요, 감사합니다! @Brian - 원래의 게시물 – Brian

+1

을 업데이트했습니다. 복사 및 붙여 넣기에 오류가 없습니까? 에러 메시지는'dbms_output' 패키지를 참조 할 때 오타가 있음을 의미하는 식별자'dbms.output'을 참조합니다. 하지만 코드에 오타가없는 것 같습니다. 오류 메시지는 해당 텍스트가 게시 된 코드의 아무 곳에 나 나타나지 않을 때 식별자 '오류'를 참조합니다. 또한,'CREATE'를 포함한 완전한 트리거 정의를 게시 할 수 있습니까? –

답변

-2

bookCursor의 %의 NOTFOUND; ?

작전 ;-) ​​전체 트리거를 게시하십시오. dbms 버퍼의 크기는 얼마입니까?

+0

어디에 추가합니까? – Brian

+3

그럴 필요가 없습니다. 루프를 다시 읽으십시오. –

1

dbms.output을 지정하고 있습니다. 트리거에서 dbms_output.put_line을 시도하십시오.

편집 : 당신은 잘못 RAISE_APPLICATION_ERROR를 호출하고

. 먼저 여기에 큰 따옴표로 묶은 문자열을 사용하지 마십시오. 문자열이 아니라 식별자를 나타냅니다. 둘째,이 절차의 구문은 다음과 같습니다.

raise_application_error(error_number, message[, {TRUE | FALSE}]); 
See the documentation보다 철저한 치료.

트리거가 실행되는 동일한 테이블에서 선택하기 때문에 두려운 "ORA-04091 : 테이블 XXXXX는 돌연변이입니다"라는 오류가 발생합니다. 자세한 내용은 this AskTom 문서를 참조하십시오.

+0

같은 오류가 있습니다. – Brian

0

시도해보십시오.

변경 :

dbms.outputraise_application_error('Error'); 또한

CREATE OR REPLACE TRIGGER checkRecommendedAge 
BEFORE INSERT OR UPDATE ON Loan 
FOR EACH ROW 
DECLARE 
    borAge number; 
    ex  exception; 

BEGIN 
    SELECT count(*) INTO borAge 
    FROM Loan 
    WHERE dateOut = new.dateOut; 
    IF borAge < 18 THEN 
     dbms_output.put_line('Row added to Book table succesful'); 
    ELSE 
     raise ex; 
    END IF; 

    EXCEPTION 
    WHEN EX THEN 
    raise_application_error('Error'); 
END; 
/
0

-

dateOut =:dateOut =

raise_application_error("Error");-dbms_output에,

WHERE dateOut =: new.dateOut; 

아마해야합니다 :

WHERE dateOut = new.dateOut;