【问题标题】:Oracle row-level triggerOracle 行级触发器
【发布时间】:2015-11-14 06:15:28
【问题描述】:

我有一些关于触发器的错误...

我查看了文档,但没有找到任何解决方案。

触发器简单如下:

CREATE OR REPLACE TRIGGER upm AFTER INSERT ON transaction
BEGIN
    UPDATE manufacturer M SET M.mPhoneNumber = M.mPhoneNumber+1 WHERE 
    M.mID = 
    (SELECT P.mID
     FROM part P where p.pID = :NEW.pID);
 END;
 /

这看起来不错..但总是以错误告终。

2/1      PL/SQL: SQL Statement ignored
4/3      PL/SQL: ORA-00921: unexpected end of SQL command
6/4      PLS-00103: Encountered the symbol "end-of-file" when expecting
         one of the following....

怎么了?

感谢大家的帮助!

【问题讨论】:

  • Transaction 是保留字,您正在使用 NEW 表示未发生 INSERT 的表。
  • 但事务是我的表名...
  • 而且 NEW 不是指你插入到表事务中的新记录吗?
  • 您只能在行级触发器中引用:NEW:OLD,即使用FOE EACH ROW子句。

标签: oracle plsql triggers


【解决方案1】:

您正在创建一个语句级触发器。您只能使用行级触发器来引用:NEW:OLD 值。

来自documentation

每一行

将触发器创建为行触发器。数据库触发行触发器 对于受触发语句影响并满足的每一行 WHEN 条件中定义的可选触发约束。

如果省略此子句,则触发器是语句触发器。这 数据库仅在触发语句时触发语句触发器 如果满足可选的触发约束,则发出。

您必须使用 FOR EACH ROW 子句使其成为行级触发器。

CREATE OR REPLACE TRIGGER upm 
AFTER INSERT ON transaction

-- add the below clause to make it row-level

FOR EACH ROW
BEGIN
    UPDATE manufacturer M SET M.mPhoneNumber = M.mPhoneNumber+1 WHERE 
    M.mID = 
    (SELECT P.mID
     FROM part P where p.pID = :NEW.pID);
 END;
 /

更新

OP 在从 Windows 迁移到 Unix OS 时发现文件格式不一致导致的错误。

要修复文件格式问题,请执行以下操作:

dos2unix filename

【讨论】:

  • 谢谢!其实最初我有那个“每行”......但当时它不起作用。刚才我发现这是因为我正在通过 SSH 将语句从 Windows 复制到 Unix ......而且系统之间的换行符不同。这会导致错误。
  • @Tipton 感谢您的反馈。我为答案添加了更新,您可以在将来使用dos2unix 来修复文件格式。
【解决方案2】:

问题解决了。

实际上我最初有那个“FOR EACH ROW”......但当时它不起作用。刚才我发现这是因为我正在通过 SSH 将语句从 Windows 复制到 Unix ......而且系统之间的换行符不同。这会导致错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2020-03-10
    • 2023-03-30
    • 2011-05-11
    相关资源
    最近更新 更多