2012-01-13 64 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;