插入触发器后更新相同的表

时间:2014-09-27 07:56:59

标签: oracle stored-procedures triggers oracle11g

我正在开发一种产品,当有人等待超过15分钟时,我必须向有关人员发送短信。

为此,当CUST_ID, CUST_CATEGORY, DURATION超过15时,我编写了一个监视表并将Duration存储在单独表中的过程。该表的表结构为:

Some_Table

CUST_ID CUST_CATEGORY DURATION SMS_STATUS

我写了一个触发器:

触发

create or replace trigger kiosk_sms_trg 
after insert on Some_Table 
referencing new as new old as old
for each row
BEGIN 
SMS_Proc@My_Server; --Procudure that generates SMS
update Some_Table set status = 'Y' where id = (select max(id) id  from Some_Table where status = 'N'); --Update Table that SMS has been sent
select 'Y' into :new.status from dual;
END;

但它会造成突变问题。我该如何解决?任何帮助将受到高度赞赏。我正在使用Oracle 11G。

2 个答案:

答案 0 :(得分:1)

我认为SOME_TABLE不允许UPDATE,因为它正在变异。

为什么不把它放在首先触发触发器的INSERT语句之后呢?

INSERT INTO SOME_TABLE ...
update Some_Table set status = 'Y' where id = (select max(id) id  from Some_Table where status = 'N'); --Update Table that SMS has been sent

我想这是正确的方法,因为你在UPDATE中没有做任何特定行的行。

正如我在评论中提到的,AFTER INSERT触发器中的最后一个语句是否有任何特殊用途?它确实在BEFORE INSERT触发器中有意义。

select 'Y' into :new.status from dual;

答案 1 :(得分:0)

您无法在行级AFTER Trigger中更新同一个表。
将您的行级AFTER INSERT触发器更改为行级BFEORE INSERT触发器。

但是你在触发器内更新stmt不会影响正在插入的新记录。

想知道怎么做,这很棘手。