Oracle触发器不更新

Oracle触发器不更新,oracle,oracle11g,triggers,Oracle,Oracle11g,Triggers,我已经运行了这段代码来创建这个触发器,因为我需要用表1中插入的序列号相同的行的UID值来更新表2 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 =

我已经运行了这段代码来创建这个触发器,因为我需要用表1中插入的序列号相同的行的UID值来更新表2

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;
触发器似乎没有问题,所以我

SET SERVEROUTPUT ON;
然后

INSERT INTO TABLE1 (SEQ, UID) VALUES (47, 'TEST_VALUE');
并得到预期的输出

UPDATE TABLE2 SET UID = TEST_VALUE                            WHERE SEQ = 47;
因此,正确的值似乎进入触发器。然后我通过运行检查表2

SELECT SEQ,UID FROM TABLE2 WHERE SEQ = 47;
得到

SEQ UID                                
--- ------------------------------------
47                                    
1 row selected.

有人知道我错在哪里了吗?

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

UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq;
将seq和uid解析为表2中的列,而不是同名的局部变量。因此,您正在更新表2中的每一行,并将uid值设置为现有值。最简单的解决方案是重命名局部变量,这样它们就不会与任何标识符冲突。我会使用l_u前缀


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

如果这真的是您的代码,那么

UPDATE TABLE2 SET TABLE2.UID = uid WHERE TABLE2.SEQ = seq;
将seq和uid解析为表2中的列,而不是同名的局部变量。因此,您正在更新表2中的每一行,并将uid值设置为现有值。最简单的解决方案是重命名局部变量,这样它们就不会与任何标识符冲突。我会使用l_u前缀


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

您是否进行了回滚,即忘记提交了?这是同一个会话。不过,我尝试过在事后运行提交,只是为了确定。您是否进行了回滚,即您是否忘记提交?这是同一个会话。不过,为了确保这一点,我已经尝试过在事后进行提交。