Oracle行级触发器

时间:2015-11-14 06:15:28

标签: oracle plsql triggers

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

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

触发器很简单,如下所示:

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....

出了什么问题?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

来自documentation

  

FOR EACH ROW

     

将触发器创建为行触发器。数据库触发行触发器   对于受触发语句影响并满足的每一行   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;
 /

<强>更新

由于从Windows迁移到Unix OS时文件格式不一致,OP发现了错误。

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

dos2unix filename

答案 1 :(得分:0)

问题解决了。

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