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