【发布时间】:2020-10-07 18:19:55
【问题描述】:
我的代码不起作用。没有错误
要求:
我想在 TABLE1 上创建一个触发器(在插入之前或之后)以更新 TABLE1.TABLETYPE=1 列并将 TABLE1.E2B2 XML 标记值更新为 1(/icstable/safetytable/tabletype)
注意:TABLE1.E2B2 是 clob 并存储 XML 文件。
有两个问题:1)“WHEN TRIGGER”条款不起作用
2)当我删除时触发子句时,更新也没有发生。
对于表 1 中 TABLE1.AGENCY_ID=12345 和 TABLE1.TABLETYPE=2
的所有记录CREATE OR REPLACE TRIGGER TRG_SAF_BEF_INS BEFORE
INSERT ON TABLE1 REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
WHEN (NEW.AGENCY_ID = 12345 AND NEW.TABLETYPE=2)
DECLARE
v_error_code NUMBER;
v_rep_id NUMBER;
BEGIN
--Updating TABLE1.TABLETYPE to 1
:NEW.TABLETYPE:=1;
--updating the TABLE1.E2B2 Which is XML File stored in CLOB
select updatexml( xmltype.createxml(:NEW.E2B2),'/icstable/safetytable/tabletype/text()',1 ).getClobVal()
INTO :NEW.E2B2 FROM DUAL;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20004, 'ERROR');
END TRG_SAF_BEF_INS;
创建表是这样的:
create table table1 (agency_id number,tabletype number,e2b2 clob);
The data looks below:
**********************************************
||agency_id || tabletype || e2b2 ||
**********************************************
12345 2 "<icstable>
<safetytable>
<safetytableid>E3223</safetytableid>
<transmissiondater>20201007105128-0700</transmissiondater>
<tabletype>2</tabletype>
</icstable>
</safetytable>"
22332 4 "<icstable>
<safetytable>
<safetytableid>E5623</safetytableid>
<transmissiondater>20201007105128-0700</transmissiondater>
<tabletype>4</tabletype>
</icstable>
</safetytable>"
45226 3 "<icstable>
<safetytable>
<safetytableid>E3823</safetytableid>
<transmissiondater>20201007105128-0700</transmissiondater>
<tabletype>3</tabletype>
</icstable>
</safetytable>"
12345 2 "<icstable>
<safetytable>
<safetytableid>E3333</safetytableid>
<transmissiondater>20201007105128-0700</transmissiondater>
<tabletype>2</tabletype>
</icstable>
</safetytable>"
12345 1 "<icstable>
<safetytable>
<safetytableid>E322w2</safetytableid>
<transmissiondater>20201007105128-0700</transmissiondater>
<tabletype>1</tabletype>
</icstable>
</safetytable>"
【问题讨论】:
-
“不工作”不是 Oracle 错误。我建议你删除这个 useless 异常处理部分,让 Oracle 报错。
-
谢谢小脚,当我说不工作时,我的意思是更新没有发生。问题是为什么 WHEN 触发条件不起作用?以及更改未更新的原因。
-
你能发布一个测试用例吗? CREATE TABLE + INSERT INTO 以便我们自己查看?
-
创建表 TABLE1 (TABLETYPE NUMBER,E2B2 CLOB);
表类型值为 1,2,3,4,5,6。
E2B2 值如下所示E3823 20201007105128-0700 2