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