Oracle触发器不会更新

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)

有人看到我哪里错了吗?

Jus*_*ave 6

如果这真的是你的代码,那么声明

UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq;
Run Code Online (Sandbox Code Playgroud)

解析sequid列中的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)

我相信您也可以使用触发器名称限定sequid强制这些引用为局部变量.从未尝试使用触发器,但它的工作方式与其他命名的PL/SQL块(如过程和函数)的工作方式相同.但我更愿意重命名我的局部变量.