首页 > 解决方案 > ORA-04092: 在超过每日申请数量后无法在触发器中回滚

问题描述

如果假设有申请人,职位,申请关系和申请就像关联类,我可以知道如何编写触发器,因为申请人可以申请许多职位,一个职位可以被许多申请人申请,并且申请关系有自己的名为 dateApp 的属性,我想将申请数量限制为一天两次,因此这意味着客户一天只能申请 2 件商品。到目前为止,我有这个代码:

CREATE OR REPLACE TRIGGER APPLYTWICEONLY
AFTER INSERT ON APPLIES
DECLARE
CURSOR C IS
SELECT ANUMBER, COUNT(APPDATE) AS TOTAL
FROM APPLIES
WHERE APPDATE = TRUNC(SYSDATE)
GROUP BY ANUMBER;
BEGIN


FOR APPLY IN C
LOOP

   IF APPLY.TOTAL > 2 THEN
      DBMS_OUTPUT.PUT_LINE('AN APPLICANT CAN APPLY MAXIMUM TWICE A DAY.');
      ROLLBACK;
   END IF;
END LOOP;


END;
/

所以这里发生的事情是,在申请人申请职位后,我使用该号码检查每个申请人今天提出的申请总数,如果今天申请人的申请总数超过 2,那么我将回滚并撤消该插入。我想使用语句触发器而不是行触发器来执行此操作,但是在申请人超过当天的申请数量后,我不断收到 ORA-04092: cannot ROLLBACK in a trigger。有人能帮我吗?

标签: oracleplsqldatabase-trigger

解决方案


您不能在触发器中运行 COMMIT 或 ROLLBACK:

$ oerr ora 4092
04092, 00000, "cannot %s in a trigger"
// *Cause: A trigger attempted to commit or rollback.
// *Action: Rewrite the trigger so it does not commit or rollback.
$ 

推荐阅读