我有一些关于触发器的错误......
我查看了该文档,但未找到任何解决方案。
触发器很简单,如下所示:
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....
出了什么问题?
感谢您的帮助!
答案 0 :(得分:3)
您正在创建语句级触发器。您只能使用行级触发器来引用:NEW
和:OLD
值。
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 ......并且系统之间的新行字符不同。这会导致错误。