【问题标题】:Oracle PL/SQL: a scheduled procedure, leading to firing of a trigger?Oracle PL/SQL:一个计划的过程,导致触发触发器?
【发布时间】:2012-01-05 23:58:16
【问题描述】:

好的,我是 Oracle PL/SQL 的新手,偶然发现了一个我无法弄清楚的问题。 我有一个过程可以将数据从一个表传输到另一个表,还有一个触发器在插入第二个表时激活。我使用 DBMS_JOB.SUBMIT 安排了该程序每分钟运行一次(用于测试 - 一旦我弄清楚了就会每天运行一次) - 预定的部分运行良好,但是在程序完成后触发器未触发。我尝试使用插入子句之前和之后,但它仍然无法正常工作。如果我直接调用该过程,它会起作用,并且它会触发触发器就好了。所以......我已经想知道预定的程序是否可以触发触发器?!

这是日程安排的代码:

DECLARE
  VJOBN BINARY_INTEGER;
BEGIN
  DBMS_JOB.SUBMIT(
  JOB => VJOBN,
  INTERVAL => 'SYSDATE + 1/2880', 
  WHAT => 'BEGIN my_procedure(); END;'
  );
END;


create or replace TRIGGER TO_PRJ
AFTER INSERT ON PROJECTS
FOR EACH ROW
BEGIN
  IF INSERTING
  THEN DBMS_OUTPUT.PUT_LINE('INSERTED PROJECT WITH ID:  '||:NEW.PROJECT_ID||')
  END IF;
END;​

表 PROJECTS 有 ID 号、名称 varchar2 和其他一些不重要的。 该过程将 ID 和名称从订单传输到项目。

附:我正在使用http://apex.oracle.com,当我从中获取时间戳时,时间实际上比我晚了 6 个小时 - 不确定它是否有任何意义......

【问题讨论】:

  • Oracle 作业将照常进行。无需担心触发。如果您在存储过程或表中设置触发器,它将照常运行。顺便说一句,你为什么把“存在与结束”放在What子句中?
  • @ppshein 好吧...我担心触发器,因为当作业调用存储过程时它不会运行。我把存在结束的东西,因为这就是我在我读过的一个教程中看到的 - 不再记得是哪一个,搜索了十亿试图找出它。

标签: oracle plsql triggers


【解决方案1】:

DBMS_OUTPUTDBMS_JOB 与您尝试使用它们的方式不同。计划的作业可能正在运行,触发器正在触发 - 但由于需要在执行DBMS_OUTPUT 命令的会话(即DBMS_JOB 使用的内部会话)中激活DBMS_OUTPUT,您将永远看不到任何输出。

DBMS_OUTPUT 的输出在整个会话中不可见,因此发出DBMS_JOB.submit 命令的会话将不会收到输出,即使为该会话激活了DBMS_OUTPUT

【讨论】:

  • 是的,我刚刚读到它并意识到发生了什么。但是有没有办法让计划作业与触发器一起输出消息?
  • 你可以例如使用表进行通信,或使用 UTL_FILE 写入文件。
【解决方案2】:

尝试使用调度程序,它比作业好得多。并带上触发器和表格的代码,它可能会有所帮助

【讨论】:

  • 我也尝试使用调度程序 - 程序执行,但触发器没有触发。我用触发代码更新了第一篇文章。
  • 有一些方法可以从调度程序发送消息,我从未使用过,但它们存在。如果你需要消息,为什么你不能使用特殊的表并在那里插入数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2012-04-20
  • 2014-04-07
  • 2011-08-06
相关资源
最近更新 更多