我是plsql的新手; 我有2个表,tableA和tableB。
tableA是我的主表。在tableA上插入或更新后,我想用它的相关表更新它。
例如:tableA具有名为“GID_FROM_B”的列,而tableB具有名为“GID”的列。我可以将此表的值与id和counter匹配。根据下表,我想从我的界面向tableA添加(2,5,'')的值。 gid_from_b将使用触发器进行更新。我在下面写了触发器。
tableA:
id | counter | gid_from_b |
1 3 xyz
tableB:
id | counter | gid |
1 3 xyz
2 5 abc
CREATE OR REPLACE TRIGGER gid_update
AFTER INSERT OR UPDATE ON DBO.TABLEA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
UPDATE TABLEA
SET GID_FROM_B = TABLEB.GID
WHERE TABLEA.ID = TABLEB.ID AND TABLEA.COUNTER = TABLEB.COUNTER;
END;
答案 0 :(得分:1)
仅执行INSERT
次操作,我们需要将AFTER INSERT OR UPDATE
替换为BEFORE INSERT
,而无法使用AFTER INSERT TRIGGER
前缀列创建:new
以下适合您的目标:
CREATE OR REPLACE TRIGGER gid_update
BEFORE INSERT ON TableA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
for c in ( select b.gid from tableB b where b.id = :new.id and b.counter = :new.counter )
loop
:new.gid_from_b := c.gid;
end loop;
END;
答案 1 :(得分:1)
您不需要运行任何更新语句,只需使用select into:NEW.gid_from_b。请注意,如果要修改BEFORE UPDATE TRIGGER
列的值,则应为:NEW
。
这假设您的TableB
每个ID,计数器组合都有一行。如果没有,您可能需要提取MAX(gid)
MIN(gid)
或适合您的任何内容。
CREATE OR REPLACE TRIGGER gid_update
BEFORE INSERT OR UPDATE ON TABLEA
FOR EACH ROW WHEN (NEW.gid_from_b IS NULL)
BEGIN
SELECT gid INTO
:NEW.gid_from_b FROM tableB b
WHERE b.id =:NEW.id AND b.counter = :NEW.counter;
END;
/