PLSQL 使用触发器插入和更新另一个 table

PLSQL Insert and update another table with trigger

我是 plsql 的新手; 我有 2 个 tables,tableA 和 tableB。

tableA是我的主table。在 tableA 上插入或更新后,我想用它的相关 table.

更新它

例如:tableA 的列名为 'GID_FROM_B',tableB 的列名为 'GID'。我可以将此 table 的值与 id 和计数器匹配。根据下面 table 我想从我的界面将 (2, 5, '') 的值添加到 tableA 。并且 gid_from_b 将使用触发器进行更新。我在下面写了触发器。

tableA:
id     |   counter  |   gid_from_b  |
1             3            xyz                            


tableB:
id     |   counter  |      gid      |
1             3            xyz                            
2             5            abc 

</code></p> <pre><code>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;

为了只执行 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;

您不需要 运行 任何更新语句,只需使用 select 到 :NEW.gid_from_b。请注意,如果要修改 :NEW 列的值,它应该是 BEFORE UPDATE TRIGGER

这假定您的 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