【问题标题】:SQL - Oracle 11g - PL/SQL - Trigger compilation errorSQL - Oracle 11g - PL/SQL - 触发编译错误
【发布时间】:2012-02-09 17:04:48
【问题描述】:

我在运行这段代码时遇到了问题。它说触发器是用编译错误创建的,但没有解释什么是错误的,也没有给出任何输出。下面是我给出的代码和错误。我在 Oracle 11g R1 上并且正在使用 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

任何帮助将不胜感激

谢谢

【问题讨论】:

  • 编译后尝试发出SHOW ERRORS
  • @Cyber​​nate 嗨,谢谢!我更新了原帖
  • @Brian - 你确定没有复制和粘贴错误吗?错误消息引用了标识符dbms.output,这意味着您在引用dbms_output 包时打错了字。但是您的代码似乎没有那个错字。当该文本未出现在发布的代码中的任何位置时,错误消息还引用了标识符 Error。另外,您能否发布完整的触发器定义,包括CREATE
  • @Justin Cave 我该如何做完整的触发操作?
  • @Brian - 我不确定我是否遵循了这个问题。据推测,您正在通过编写以CREATE [OR REPLACE] TRIGGER &lt;&lt;trigger name&gt;&gt; 开头的语句来创建触发器,对吧?只需在此处复制并粘贴整个 CREATE TRIGGER 语句,而不是仅发布以 DECLARE 开头的触发器正文。

标签: oracle plsql triggers oracle11g sqlplus


【解决方案1】:

还有,

WHERE dateOut =: new.dateOut;

应该是:

WHERE dateOut = new.dateOut;

【讨论】:

    【解决方案2】:

    您正在指定 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 文章了解更多信息。

    【讨论】:

      【解决方案3】:

      试试这个。

      更改:

      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;
      /
      

      【讨论】:

        【解决方案4】:

        在哪里 当 bookCursor%NOTFOUND 时退出; ?

        Ops ;-) 尝试发布完整的触发器。 dbms 缓冲区的大小是多少?

        【讨论】:

        • 没有必要。再读一遍循环。
        猜你喜欢
        • 2010-12-12
        • 2015-05-13
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 2018-12-18
        • 2021-12-27
        • 2014-01-04
        • 1970-01-01
        相关资源
        最近更新 更多