警告:使用编译错误创建触发器?

Posted

技术标签:

【中文标题】警告:使用编译错误创建触发器?【英文标题】:Warning: Trigger created with compilation errors? 【发布时间】:2017-08-05 17:26:03 【问题描述】:

我正在尝试实现引发用户定义的错误消息并且不允许在数据库中进行更新和插入操作的触发器。我是 pl/sql 的新手,我从互联网上引用了一些代码并尝试实现。我的代码运行正常,因为我无法更新/插入数据库,但我仍然无法获取用户定义的消息,而且我收到此警告。

Warning: Trigger created with compilation errors ?

这是桌子:

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER(5)
 NAME                                               VARCHAR2(20)
 SALARY                                             NUMBER(10)
 DEPOT_ADDRESS                                      VARCHAR2(15)

这是我的代码:

create or replace trigger cleaner_before_update_insert
for update or insert on cleaner
compound trigger
count binary_integer;

before statement is 
begin
    count:=0;
end before statement;

after each row is 
begin 
count :=count +1;
end after each row;

after statement is 
begin
    if count > 0 then
        raise_application_error( -20001,'Update/insert operation can not be completed ');  
    end if;   
 end after statement;  

 end cleaner_before_update;
 /

谁能帮我找出这里的问题和解决方法。 提前致谢。

即使在编译代码之后它仍然给我这个错误。

ORA-06512: at "SYSTEM.CLEANER_BEFORE_UPDATE_INSERT", line 18 
ORA-04088: error during execution of trigger                                         
'SYSTEM.CLEANER_BEFORE_UPDATE_INSERT' 

【问题讨论】:

编译错误消息应该提示需要修复的内容。 我无法弄清楚错误在哪里,你能帮我吗? 所以你使用的工具不会自动显示编译错误,你用谷歌搜索了“如何查看PL/SQL中的编译错误”,一无所获,你什么也没找到文档,这是你编码的第一件事? 你试过理解你的代码吗?您提出的异常将在插入/更新时显示整个错误消息堆栈。它确实会显示用户定义的消息以及其他消息。这是默认行为。 【参考方案1】:

您的 TRIGGER 块存在几个问题。

触发器的名称cleaner_before_update_insert 与最后的end 语句后的cleaner_before_update 不匹配。

COUNT 是 SQL 关键字,不允许在 PL/SQL 中用作变量。您将收到错误 - Error(10,11): PLS-00204: function or pseudo-column 'COUNT' may be used inside a SQL statement only

所以,这里是修改后的代码。

CREATE OR REPLACE TRIGGER cleaner_before_update_insert FOR UPDATE OR
  INSERT ON cleaner compound TRIGGER 
v_count binary_integer;
  before STATEMENT
IS
BEGIN
  v_count:=0;
END before STATEMENT;
AFTER EACH row
IS
BEGIN
  v_count :=v_count +1;
END AFTER EACH row;
AFTER STATEMENT
IS
BEGIN
  IF v_count > 0 THEN
    raise_application_error( -20001,'Update/insert operation can not be completed ');
  END IF;
END AFTER STATEMENT;
END cleaner_before_update_insert;
/

【讨论】:

它仍然给我这个 ORA-06512 的错误:在“SYSTEM.CLEANER_BEFORE_UPDATE_INSERT”,第 18 行 ORA-04088:执行触发器“SYSTEM.CLEANER_BEFORE_UPDATE_INSERT”时出错 我需要在哪里添加异常。 这是一个不同的错误。以前代码由于语法错误而无法编译,现在它阻止了按设计的插入 (v_count > 0)。错误消息应该指出了这一行。 @Sachin,这不是你在问题中描述的。你编写了脚本来提高EXCEPTIONcount > 0,它正在相应地提高,这就是你所看到的。您现在究竟需要更改或添加什么?请在您的问题中相应更新。 我已经相应地更新了问题,你现在可以帮我吗?

以上是关于警告:使用编译错误创建触发器?的主要内容,如果未能解决你的问题,请参考以下文章

警告:创建的过程带有编译错误

警告:已编译但在 oracle 中存在编译错误

我收到警告:创建的过程存在编译错误

使用编译错误创建的触发器:

让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数

警告:在 plsql 中创建包体时出现编译错误...