【问题标题】:Trigger with cursor shown error : Trigger is invalid and failed re-validation光标显示错误触发器:触发器无效并且重新验证失败
【发布时间】:2019-11-10 21:14:24
【问题描述】:

我正在尝试使用以下代码在插入触发器后创建 Oracle:

  CREATE OR REPLACE TRIGGER AutoManhour
  AFTER INSERT ON TBL_MSTPROJECT
   FOR EACH ROW
  DECLARE
  CURSOR c_Section IS
    SELECT IDSECTION AS IDSECTION FROM TBL_MSTSECTIONHR;
    v_Section c_Section%ROWTYPE;
  BEGIN
    OPEN c_Section;
    LOOP
        FETCH c_Section INTO v_Section;
       INSERT INTO TBL_TRXMANHOURS (ID_SECTION,INPUTBY_TRXMANHOURS,INPUTON_TRXMANHOURS,ID_PROJECT)
        VALUES (v_Section.IDSECTION,'IT_ROBOT',SYSDATE,:new.IDPROJECT);
    END LOOP;
    CLOSE c_Section;
END AutoManhour;
/

但它检索到一个错误:

ORA-04098: 触发器“DEPEEL.AUTOMANHOUR”无效且失败 重新验证

为什么会这样?

【问题讨论】:

  • 对我来说,它不会从这个触发器中抛出任何错误,你能分享触发器中存在的表的最小 DDL
  • 错误提示:PLS-00103:在预期以下情况之一时遇到符号“END”:( begin case declare exit for goto if loop mod null pragma raise return select update while with
  • 它似乎与您遇到的错误没有任何关系,但您在这里呈现的是一个无限循环。你需要一个退出条件。或者使用隐式游标循环而不是显式游标来显着简化代码。

标签: oracle oracle11g triggers oracle10g database-trigger


【解决方案1】:

我认为您在将数据插入TBL_TRXMANHOURS 时一定使用了不正确的列/表名称或使用了不正确的数据类型。当然,还有一个无限循环,你应该做一些条件使它成为有限的

Oracle 将尝试重新编译引用的无效对象。这里的触发器无效

select * from user_errors where type = 'TRIGGER' and name = 'AUTOMANHOUR'

您可以尝试上述查询来查找实际错误。

干杯!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多