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

任何幫助,將不勝感激

感謝

+0

嘗試在編譯後發出'SHOW ERRORS'。 – Chandu 2012-01-13 13:52:12

+0

@Cyber​​nate嗨,謝謝!我更新了原始帖子 – Brian 2012-01-13 13:59:48

+1

@Brian - 你確定沒有複製和粘貼錯誤?該錯誤消息引用一個標識符「dbms.output」,這意味着當您引用'dbms_output'包時您犯了一個錯字。但是你的代碼似乎沒有那個錯字。當該文本未出現在發佈代碼中的任何位置時,該錯誤消息還引用標識符「錯誤」。另外,你可以發佈完整的觸發器定義,包括'CREATE'嗎? – 2012-01-13 14:29:34

回答

-2

哪裏 出關時bookCursor%NOTFOUND; ?

Ops ;-)嘗試發佈完整觸發器。 dbms緩衝區的大小是多少?

+0

我在哪裏添加它? – Brian 2012-01-13 14:15:12

+3

沒有這個需要。再次閱讀循環。 – 2012-01-13 14:17:50

1

您在指定dbms.output。在觸發器中嘗試dbms_output.put_line。

編輯:

你正確調用RAISE_APPLICATION_ERROR。首先,不要在這裏使用雙引號字符串 - 表示一個標識符,而不是一個字符串。其次,這個程序的語法是:

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

See the documentation爲更徹底的治療。

你也可能會遇到可怕的「ORA-04091:Table XXXXX is mutating」錯誤,因爲你從同一張表中選擇觸發器正在觸發。有關更多信息,請參閱this AskTom文章。

+0

我得到了同樣的錯誤 – Brian 2012-01-13 16:13:50

0

試試這個。

變化:

dbms.outputdbms_output

dateOut =:dateOut =

raise_application_error("Error");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

此外,

WHERE dateOut =: new.dateOut; 

大概應該是:

WHERE dateOut = new.dateOut;