use*_*756 1 oracle triggers oracle11g
我已经运行此代码来创建此触发器,因为我需要使用插入TABLE1中的相同序列号的行的UID值更新TABLE2.
CREATE OR REPLACE TRIGGER TRIG_NAME BEFORE INSERT ON TABLE1 FOR EACH ROW
DECLARE
seq NUMBER(10);
uid CHAR(36);
BEGIN
seq := :new.SEQ;
uid := :new.UID;
UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq;
DBMS_OUTPUT.put_line('UPDATE TABLE2 SET UID = '||uid||' WHERE SEQ = '||seq||';');
END;
Run Code Online (Sandbox Code Playgroud)
触发似乎没有问题,所以我
SET SERVEROUTPUT ON;
Run Code Online (Sandbox Code Playgroud)
然后
INSERT INTO TABLE1 (SEQ, UID) VALUES (47, 'TEST_VALUE');
Run Code Online (Sandbox Code Playgroud)
并获得预期的输出
UPDATE TABLE2 SET UID = TEST_VALUE WHERE SEQ = 47;
Run Code Online (Sandbox Code Playgroud)
因此,正确的值似乎会进入触发器.然后我通过运行检查TABLE2
SELECT SEQ,UID FROM TABLE2 WHERE SEQ = 47;
Run Code Online (Sandbox Code Playgroud)
得到
SEQ UID
--- ------------------------------------
47
1 row selected.
Run Code Online (Sandbox Code Playgroud)
有人看到我哪里错了吗?
如果这真的是你的代码,那么声明
UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq;
Run Code Online (Sandbox Code Playgroud)
解析seq和uid列中的table2而不是同名的局部变量.因此,您要更新每一行table2并将uid值设置为现有值.最简单的解决方案是重命名本地变量,以便它们不与任何标识符冲突.我会使用l_前缀
DECLARE
l_seq NUMBER(10);
l_uid CHAR(36);
BEGIN
l_seq := :new.SEQ;
l_uid := :new.UID;
UPDATE TABLE2 SET TABLE2.UID = l_uid WHERE TABLE2.SEQ = l_seq ;
DBMS_OUTPUT.put_line('UPDATE TABLE2 SET UID = '||l_uid ||' WHERE SEQ = '||l_seq ||';');
END;
Run Code Online (Sandbox Code Playgroud)
我相信您也可以使用触发器名称限定seq并uid强制这些引用为局部变量.从未尝试使用触发器,但它的工作方式与其他命名的PL/SQL块(如过程和函数)的工作方式相同.但我更愿意重命名我的局部变量.