我正在使用Oracle DB的系统上工作。 ETL工具(ODI)将以下触发器放在表上以启用更改的数据捕获(CDC)。Oracle触发器无法识别插入
create or replace trigger SCHEMA.T$TABLE_NAME
after insert or update or delete on SCHEMA.TABLE_NAME
for each row
declare
V_FLAG VARCHAR(1);
V_ROW_ID VARCHAR2(60);
begin
if updating then
V_ROW_ID := :new.ROW_ID;
V_FLAG := 'U';
end if;
if inserting then
V_ROW_ID := :new.ROW_ID;
V_FLAG := 'I';
end if;
if deleting then
V_ROW_ID := :old.ROW_ID;
V_FLAG := 'D';
end if;
insert into SCHEMA.J$TABLE_NAME
(
JRN_SUBSCRIBER,
JRN_CONSUMED,
JRN_FLAG,
JRN_DATE,
ROW_ID
)
select JRN_SUBSCRIBER,
'0',
V_FLAG,
sysdate,
V_ROW_ID
from SCHEMA.SNP_SUBSCRIBERS
where JRN_TNAME = 'SCHEMA.TABLE_NAME'
/* The following line can be uncommented for symetric replication */
/* and upper(USER) <> upper('SCHEMA') */
;
end;
我的问题是这个东西不能识别更新。例如,当我在一行上做了一个非常简单的更新时,它仍然在CDC表中插入'I',表示它将更新作为插入读取。这是怎么回事?这有些奇怪的oracle事情?我没有在任何地方读过它。
在此先感谢!
这给我扔了一些关于不使用:new引用的错误。我猜你在说我应该将这个触发器重写为语句级触发器而不是行级触发器? http://psoug.org/reference/table_trigger.html – Nate 2010-10-12 14:42:33
是的,你是对的,:新需要一个ROW LEVEL触发器......(看我的编辑) – guigui42 2010-10-12 14:44:25
好的,这是我的问题:我需要行ID行。我不认为我可以在声明级别触发器中获得该信息,对吗? – Nate 2010-10-12 15:04:11