Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 可以在触发器内动态创建作业吗?_Oracle_Commit_Scheduler - Fatal编程技术网

Oracle 可以在触发器内动态创建作业吗?

Oracle 可以在触发器内动态创建作业吗?,oracle,commit,scheduler,Oracle,Commit,Scheduler,此触发器的执行失败(它会编译,但一旦执行指定的insert->error) 打印的计划程序创建代码完全有效 我得到一个ORA-04092'不能在触发器中。。。触发器试图提交或回滚。重写触发器,使其不提交或回滚' 这是“承诺”吗?所以不能在触发器内创建作业 我知道我在不同的表中使用了插入触发器,这也是一种“提交” Oracle没有抱怨。是的,这是一个承诺。Oracle正在更新一个系统表,job$我想,当您创建一个调度程序或作业等时,这意味着自动提交 为什么不直接将所需信息插入另一个(驱动程序)表,

此触发器的执行失败(它会编译,但一旦执行指定的insert->error)

打印的计划程序创建代码完全有效

我得到一个ORA-04092'不能在触发器中。。。触发器试图提交或回滚。重写触发器,使其不提交或回滚'

这是“承诺”吗?所以不能在触发器内创建作业

我知道我在不同的表中使用了插入触发器,这也是一种“提交”
Oracle没有抱怨。

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


为什么不直接将所需信息插入另一个(驱动程序)表,并使用cron作业或dbms\u作业来创建调度程序作业?

调用
dbms\u调度程序。create\u作业
隐式提交,因此无法在触发器中创建
dbms\u调度程序
作业。这是仍然需要使用旧的
DBMS\u作业
包的情况之一,因为
DBMS\u作业。提交
不会隐式提交

此触发器应使用
DBMS\u作业
包而不是
DBMS\u调度程序
创建所需的作业

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;

<>你也可以考虑自主交易。

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;