oracle - 如何修复“不允许新或旧引用”?
问题描述
我正在尝试在触发器中使用 new 和 old 作为引用,但我不知道如何解决我的问题。
CREATE OR REPLACE TRIGGER verifcomglob
AFTER UPDATE OF COMETAT on COMMANDE
REFERENCING NEW AS NEW
DECLARE
V_COMGLOB numeric;
V_COMPROD P.PRODNUM%TYPE;
CURSOR C_COMPROD IS
SELECT P.PRODNUM
FROM COMMANDE CM, COMMANDEGLOBALE CGN, PRODUIT P, CONCERNERGLOB CG, CONCERNER C
WHERE CM.COMNUM = C.COMNUM
AND C.PRODNUM = P.PRODNUM
AND P.PRODNUM = CG.PRODNUM
AND CG.COMGLOBNUM = CGN.COMGLOBNUM
AND CGN.COMGLOBETAT = 'en constitution'
AND CM.COMNUM=:new.COMNUM;
CURSOR C_COMGLOB IS
SELECT CGN.COMGLOBNUM
FROM COMMANDE CM, COMMANDEGLOBALE CGN, PRODUIT P, CONCERNERGLOB CG, CONCERNER C
WHERE CM.COMNUM = C.COMNUM
AND C.PRODNUM = P.PRODNUM
AND P.PRODNUM = CG.PRODNUM
AND CG.COMGLOBNUM = CGN.COMGLOBNUM
AND CGN.COMGLOBETAT = 'en constitution'
AND P.PRODNUM=V_COMPROD
AND CM.COMNUM=:new.COMNUM;
BEGIN
OPEN C_COMPROD;
LOOP
FETCH C_COMPROD INTO V_COMPROD ;
OPEN C_COMGLOB;
LOOP
FETCH C_COMGLOB INTO V_COMGLOB ;
if(C_COMGLOB%ROWCOUNT) != 0 THEN
UPDATE CONCERNERGLOB SET CONCERNERGLOB.qtecom = (CONCERNERGLOB.qtecom + (SELECT CONCERNER.QTECOM FROM CONCERNER, COMMANDE where COMNUM=:new.COMNUM AND PRODNUM=V_COMPROD)) WHERE CONCERNERGLOB.COMGLOBNUM=V_COMGLOB AND CONCERNERGLOB.PRODNUM=V_COMPROD;
ELSE
null;
end if;
END LOOP;
END LOOP;
CLOSE C_COMGLOB ;
END;
这是 Oracle 错误:
- 00000 - “表级触发器中不允许新或旧引用”
*原因:触发器正在访问表触发器中的“新”或“旧”值。
*行动:删除任何新的或旧的参考。
解决方案
您正在创建一个无法访问单个行的语句级触发器。
你显然想要一个行级触发器,所以你需要这样声明它:
CREATE OR REPLACE TRIGGER verifcomglob
AFTER UPDATE OF COMETAT on COMMANDE
REFERENCING NEW AS NEW
FOR EACH ROW --<< here
....
推荐阅读
- javascript - 如何等到在Angular内部有多个服务调用的for循环
- ruby-on-rails - SystemStackError:测试我的rails api answer_controllers时堆栈级别太深
- python - Dataframe.isin 对我不起作用,即使有相交的行也返回相同的行数
- .net - 将 https 地址传递给 WebRequest 的问题
- python - 如何将二进制文件发送到whatsapp API(web whatsapp或twilio)python
- javascript - innerText 是连接单词
- node.js - 如何制作在任何操作系统上安装 nodejs 的脚本
- python - 在 Python Beautifulsoup 中使用 itertools 将数据项数据添加到分组中
- java - 与 java.lang.Boolean 兼容的预期返回值
- javascript - 在nodejs中使用ffmpeg上传时,edge和firefox中的sharedarraybuffer错误但在chrome中没有