我正在开发一种产品,当有人等待超过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。
答案 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不会影响正在插入的新记录。
想知道怎么做,这很棘手。