【问题标题】:Can a JOB be created dynamically inside a trigger?可以在触发器内动态创建 JOB 吗?
【发布时间】:2012-01-12 15:22:12
【问题描述】:

此触发器的执行失败(它编译但一旦我执行指定的插入 -> 错误)

create or replace
TRIGGER AFT_INSERT_TMP_TBL
AFTER INSERT ON TMP_TBL
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE 

    V_SQL VARCHAR2(1000);
    A_NAME VARCHAR2(100);

BEGIN
    A_NAME:='ANY_NAME';

    V_SQL:='BEGIN 
              DBMS_SCHEDULER.CREATE_JOB (
                  job_name => '''||A_NAME||''',
                  job_type => ''PLSQL_BLOCK'',
                  job_action => ''BEGIN DBMS_OUTPUT.PUT_LINE('||A_NAME||'); END;'',
                  start_date => TIMESTAMP''2011-12-4 10:30:00'',
                  repeat_interval => ''FREQ=MINUTELY;INTERVAL=2'',
                  auto_drop => FALSE,
                  comments => '''||A_NAME||''');
            END;';
     DBMS_OUTPUT.PUT_LINE('SCHEDULER :'||V_SQL);
     EXECUTE IMMEDIATE V_SQL;

END AFT_INSERT_TMP_TBL;
-----------------------

打印的SCHEDULER创建代码完全有效。

我收到 ORA-04092 'cannot in a trigger... 一个触发器试图提交或回滚。重写触发器,使其不会提交或回滚。

这是“提交”吗?所以不能在触发器内部创建 JOB?

我知道我已经使用了将触发器插入到不同的表中,这也是一个“提交” 甲骨文没有抱怨。

【问题讨论】:

    标签: oracle commit scheduler


    【解决方案1】:

    调用DBMS_SCHEDULER.CREATE_JOB 会隐式提交,因此您无法在触发器中创建DBMS_SCHEDULER 作业。这是仍然需要使用旧的 DBMS_JOB 包的情况之一,因为 DBMS_JOB.SUBMIT 不会隐式提交。

    此触发器应使用 DBMS_JOB 包而不是 DBMS_SCHEDULER 创建您想要的作业。

    create or replace
    TRIGGER AFT_INSERT_TMP_TBL
    AFTER INSERT ON TMP_TBL
    REFERENCING OLD AS OLD NEW AS NEW
    FOR EACH ROW
    DECLARE 
    
        V_SQL VARCHAR2(1000);
        A_NAME VARCHAR2(100);
        l_jobno NUMBER;
    BEGIN
        A_NAME:='ANY_NAME';
    
        dbms_job.submit( l_jobno,
                         'BEGIN dbms_output.put_line( ''' || a_name || ''' ); END;',
                         sysdate + interval '2' minute,
                         'sysdate + interval ''2'' minute' );
         DBMS_OUTPUT.PUT_LINE('Job Number:'||l_jobno);
    
    END AFT_INSERT_TMP_TBL;
    

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        是的,这是一次提交。 Oracle 正在更新系统表job$ 我认为,当您创建调度程序或作业等时,这意味着自动提交。

        您为什么不直接将您需要的信息插入另一个(驱动程序)表并使用 cron 作业或 dbms_job 来创建调度程序作业?

        【讨论】:

          猜你喜欢
          • 2011-08-24
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 2017-05-24
          • 2015-09-30
          • 2012-06-10
          相关资源
          最近更新 更多