2012-01-13 32 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

@Cyber​​nateこんにちはありがとう! @Brian - オリジナルの投稿を更新しました – Brian

+1

@Brian - コピー&ペーストのエラーはありませんか?エラーメッセージは識別子 'dbms.output'を参照します。これは' dbms_output'パッケージを参照したときにタイプミスをしたことを意味します。しかし、あなたのコードはそのタイプミスを持っていないようです。また、エラーメッセージは、そのテキストが投稿されたコードのどこにも現れないとき、識別子「エラー」を参照します。また、 'CREATE'を含む完全なトリガ定義を投稿できますか? –

答えて

-2

bookCursorの%のNOTFOUND; ?

Ops ;-)完全トリガーを投稿してください。 dbmsバッファのサイズは?

+0

どこに追加しますか? – Brian

+3

その必要はありません。ループをもう一度読んでください。 –

1

dbms.outputを指定しています。トリガーでdbms_output.put_lineを試してください。

EDIT:あなたは間違ってRAISE_APPLICATION_ERRORを呼んでいる

。まず、ここで二重引用符で囲まれた文字列を使用しないでください。これは文字列ではなく識別子を示します。第二に、このプロシージャの構文は次のとおりです。より徹底した治療のため

raise_application_error(error_number, message[, {TRUE | FALSE}]); 

See the documentation

また、トリガーが発生している同じ表から選択しているため、恐ろしい "ORA-04091:表XXXXXは突然変異しています"というエラーが発生する可能性があります。詳細については、this AskTomの記事を参照してください。

+0

同じエラーが発生しました – Brian

0

これを試してください。 raise_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 =

raise_application_error("Error");からdbms_output

dateOut =:から

dbms.outputまた、

WHERE dateOut =: new.dateOut; 

は、おそらく次のようになります:

変更を

WHERE dateOut = new.dateOut;