Oracle 如何在同一个表中使用AFTER INSERT触发器更新表?

Oracle 如何在同一个表中使用AFTER INSERT触发器更新表?,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,表上有两个触发器,一个在插入之前,一个在插入之后: CREATE OR REPLACE TRIGGER DEMO_TRG AFTER INSERT ON A REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW declare PRAGMA AUTONOMOUS_TRANSACTION; begin UPDATE A SET STATUS = 'DONE' WHERE id_id =:new.p_id; commit; END; / 为什么插入后状

表上有两个触发器,一个在插入之前,一个在插入之后:

CREATE OR REPLACE TRIGGER DEMO_TRG
AFTER INSERT
ON A
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin

UPDATE A
SET STATUS = 'DONE'
WHERE id_id =:new.p_id;

commit;

END;
/

为什么插入后状态未设置为“完成”时更新命令不起作用?我遗漏了什么吗?

问题很可能是由于自主交易造成的-当您这样做时,您实际上是在切换到另一个交易,而该交易不知道您的未提交交易,即插入,因此它没有任何可更新的内容


您应该做的是修改before触发器中的列:new.status:=“DONE”。或者,更好的做法是避免触发器,将逻辑放在存储过程中,不允许任何人直接插入表中,尽管我知道如果有很多应用程序直接插入表中,这可能是一个很大的转变,等等

您到底想做什么?带有自治事务和提交的触发器实际上没有意义。您试图解决的根本问题是什么?为什么不给before触发器中的status列分配一个新值呢?那么before触发器是做什么的呢?为什么要在同一事务的第二个触发器中这样做呢?当然,这是一个完全独立的声明?例如,执行插入,然后,稍后再执行单独的更新语句。?将记录插入Web界面插入插入之前的现有触发器将其状态设置为“已请求”我正在尝试模拟一个Web服务,该服务在某个时间后更新此记录的状态,这就是为什么我在插入后使用触发器,确切地说是:在引用NEW as NEW OLD as OLD FOR EACH ROW declare PRAGMA autonomy_事务上插入后创建或替换触发器DEMO_TRG;开始dbms_lock.sleep5;更新集合状态='DONE',其中id\u id=:new.p\u id;犯罪完;您是否有想法使用触发器或其他方式实现此功能。感谢代码在插入记录后应等待5秒,然后自动更新表中的状态,如何动态实现此功能?我将有一个这样的过程:插入+提交,等待5秒,更新+提交。可能是一个调用dbms_lock.sleep进行等待的sql脚本。我没有一个过程可以包括插入-提交-等待5s,然后更新。记录通过web界面插入,并在第一次请求时显示为界面用户的状态,然后他应该等待5s,以查看状态更改为完成,这就是我尝试使用after insert触发器的原因。那么,应该如何触发从request到done的状态呢?另一个程序是否轮询表并拾取请求的行,进行一些处理,然后将该行标记为已完成?如果是这样的话,并且您试图模拟轮询/更新,因为该部分尚未编写,那么我建议您创建一个dbms_调度程序作业,该作业每5秒轮询一次表,并拾取超过5秒未更新的任何行。当然,你必须有一列告诉你行插入的时间,否则,您必须接受在插入后0到10秒之间更新行。感谢您的反馈。在第一次实施时,我已经使用了一个每2秒运行一次的作业,但正如您所说,该作业可能需要7秒,规范要求5秒。这就是为什么我想使用触发器的原因,所以您有什么建议吗。tks