PLSQL使用触发器插入并更新另一个表

时间:2018-05-21 12:29:28

标签: sql oracle plsql triggers database-trigger

我是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;

2 个答案:

答案 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;
/

dbfiddle