Oracle 使用触发器插入/更新到另一个表
我有两张桌子,表A和表BOracle 使用触发器插入/更新到另一个表,oracle,triggers,Oracle,Triggers,我有两张桌子,表A和表B tableA: id | status | Flag | ResultOfAction | ExternalId | Customer 1 200 2 0 332 C1 2 200 0 0
tableA:
id | status | Flag | ResultOfAction | ExternalId | Customer
1 200 2 0 332 C1
2 200 0 0 333 C1
如果old.status new.status或Flag=3或ResultofAction=1,触发器将填充另一个表
e、 g
如果表A有新的插入项:
tableA:
id | status | Flag | ResultOfAction | ExternalId | Customer
1 200 2 0 332 C1
2 200 0 0 333 C1
3 200 2 0 334 C1
TableB将自动填充新行
tableB:
id | status | Flag | ResultOfAction | ExternalId | tableAId
1 200 2 0 332 1
2 200 2 0 334 3
如果表中的某一行发生更新。e、 g.id为1至300,然后为表B
tableB:
id | status | Flag | ResultOfAction | ExternalId | tableAId
1 300 2 0 332 1
2 200 2 0 334 3
这是我的退出触发器。有人能帮忙吗
CREATE OR REPLACE TRIGGER TABLEA_TRG AFTER INSERT OR UPDATE ON TABLEA
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW WHEN (OLD.STATUS <> NEW.STATUS OR NEW.FLAG = 3 or NEW.RESULTOFACTION = 1)
BEGIN
IF INSERTING THEN
INSERT INTO TABLEB(TABLEAID, ExternalId, STATUS, Flag)
SELECT :NEW.ID, :NEW.ExternalId, :NEW.STATUS, :NEW.FLAG FROM DUAL
WHEN NOT EXISTS (SELECT 1 FROM TABLEB WHERE tableAId = :NEW.id);
ELSIF UPDATING THEN
IF :NEW.STATUS <> :OLD.STATUS THEN
UPDATE TABLEB DWT SET DWT.tableAId = :NEW.id, DWT.ExternalId = :NEW.ExternalId,
DWT.STATUS = :NEW.STATUS, DWT.Flag = :NEW.Flag;
END IF;
MERGE INTO TABLEB D
USING DUAL ON (D.TABLEAID = :NEW.ID)
WHEN MATCHED THEN
UPDATE SET D.STATUS = :NEW.STATUS
WHEN NOT MATCHED THEN
INSERT (D.TABLEAID, D.ExternalId, D.STATUS, D.FLAG) VALUE (:NEW.ID, :NEW.ExternalId, :NEW.STATUS, :NEW.FLAG);
END IF;
END;
/
有错误
*Error7,7:PL/SQL:SQL语句被忽略
*错误9,16:PL/SQL:ORA-00933:SQL命令未正确结束
这是我第一次在Oracle中使用触发器,有人能帮我吗?我真的不知道问题出在哪里,但下面是一个例子: 我有一个表a和一个审计表,其中包含了表a上的所有操作。 因此,我有三个触发器,一个用于插入,一个用于更新,一个用于删除
create table TABLE_A
(
key_value VARCHAR2(20),
value VARCHAR2(20)
)
create table TABLE_A_AUDIT
(
audit_timestamp TIMESTAMP(6),
audit_action VARCHAR2(1),
key_value VARCHAR2(20),
value VARCHAR2(20)
)
插入触发器:
create or replace trigger table_a_insert before insert on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'I', :new.key_value, :new.value);
end;
更新触发器:
create or replace trigger table_a_update before update on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'U', :new.key_value, :new.value);
end;
create or replace trigger table_a_delete before delete on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'D', :old.key_value, :old.value);
end;
删除触发器:
create or replace trigger table_a_update before update on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'U', :new.key_value, :new.value);
end;
create or replace trigger table_a_delete before delete on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'D', :old.key_value, :old.value);
end;
我希望这个例子有帮助。您不能从双表中选择:new.id等。此表只有列虚拟。 我不确定您想要什么,但我认为您应该使用序列来获取新ID…查看以下内容:
CREATE OR REPLACE TRIGGER TABLEA_TRG AFTER INSERT OR UPDATE ON TABLEA
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW WHEN (OLD.STATUS <> NEW.STATUS OR NEW.FLAG = 3 or NEW.RESULTOFACTION
begin
IF INSERTING THEN
begin
INSERT INTO TABLEB
(TABLEAID, ExternalId, STATUS, Flag) values
(:new.id, :new.externalId, :new.status, :new.flag);
-- assuming, there is an unique key on id
exception
when dup_val_on_index then
null;
end;
ELSIF UPDATING THEN
IF :NEW.STATUS <> :OLD.STATUS THEN
UPDATE TABLEB DWT
SET DWT.tableAId = :NEW.id,
DWT.ExternalId = :NEW.ExternalId,
DWT.STATUS = :NEW.STATUS,
DWT.Flag = :NEW.Flag;
END IF;
MERGE INTO TABLEB D
USING DUAL
ON (D.TABLEAID = :NEW.ID)
WHEN MATCHED THEN
UPDATE SET D.STATUS = :NEW.STATUS
WHEN NOT MATCHED THEN
INSERT
(D.TABLEAID, D.ExternalId, D.STATUS, D.FLAG) VALUEs
(:NEW.ID, :NEW.ExternalId, :NEW.STATUS, :NEW.FLAG);
END IF;
end test;
以这种方式编写查询,只需更改此代码的insert和select命令的列名称insert触发器:
create or replace trigger table_a_insert before insert on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'I', :new.key_value, :new.value);
end;
更新触发器:
create or replace trigger table_a_update before update on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'U', :new.key_value, :new.value);
end;
create or replace trigger table_a_delete before delete on table_a for each row
begin
insert into table_a_audit
(audit_timestamp, audit_action, key_value, value)
values
(systimestamp, 'D', :old.key_value, :old.value);
end;
它在Oracle 9i和12C版本上工作得非常完美。插入和更新触发器。如果有任何疑问,请告诉我们。如果TableA正在插入,请编写一条插入语句,否则请编写一条更新语句。这有什么困难?@APC,第一次,对触发器的语法不是很确定。在网上找到那些源代码。