如何在Oracle PL/SQL包中调用Scheduler调度作业?
问题
我开发了一个Oracle PL/SQL应用,用于按流程顺序启动作业,此前运行正常。主程序读取已注册待执行程序的表,通过DBMS_JOB提交作业,代码如下:
cJob := 'begin pkg_procesos_carga.ejecutar(''' || aProcesosCarga(nProcesoActual).esquema || ''',''' || aProcesosCarga(nProcesoActual).proceso || '''); end;'; dbms_job.submit(job => nJob, what => cJob); COMMIT;
该方式运行良好。现需将作业改为Scheduler调度,我编写了类似逻辑的代码:
cJob := 'BEGIN' || kNL; cJob := cJob || 'DBMS_SCHEDULER.CREATE_JOB(' || kNL; cJob := cJob || ' job_name => ' || '' || cJobProcess || '' || ',' || kNL; cJob := cJob || ' job_type => ' || '''STORED_PROCEDURE''' || ',' || kNL; cJob := cJob || ' job_action => ' || '' || cAction || '' || ',' || kNL; cJob := cJob || ' auto_drop => TRUE,' || kNL; cJob := cJob || 'enabled => TRUE,' || kNL;
代码可能存在错误,但核心逻辑如此。请问是否可以从包中启动Scheduler调度作业?
回答
完全可以从PL/SQL包中调用DBMS_SCHEDULER.CREATE_JOB来创建并启动调度作业,这是Oracle官方支持的用法,和你之前用DBMS_JOB的场景适配性一致。
不过你当前的代码有几个需要修正的点:
- 字符串拼接时的引号处理有误:比如
job_name => ' || '' || cJobProcess || '' || ','这种写法会引发语法错误,正确的转义写法应该是'job_name => ''' || cJobProcess || ''',' - 代码片段未闭合
DBMS_SCHEDULER.CREATE_JOB的括号以及BEGIN...END块,执行时会直接报错 - 调用
DBMS_SCHEDULER.CREATE_JOB后同样需要执行COMMIT来确认作业创建(除非使用自治事务)
另外,调用存储过程时,job_action需指定存储过程的完整名称(包含模式名);如果需要传参,建议通过job_argument_names和job_arguments参数传递,而非像DBMS_JOB那样直接拼进字符串——这是Scheduler和DBMS_JOB的关键区别,能避免大量引号拼接的问题,提升代码可读性和稳定性。
给你一个修正后的示例参考:
DECLARE cJobProcess VARCHAR2(100) := 'MY_JOB_001'; cAction VARCHAR2(200) := 'PKG_PROCESOS_CARGA.EJECUTAR'; BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => cJobProcess, job_type => 'STORED_PROCEDURE', job_action => cAction, job_argument_names => 'ESQUEMA, PROCESO', job_arguments => SYS.ODCIVARCHAR2LIST(aProcesosCarga(nProcesoActual).esquema, aProcesosCarga(nProcesoActual).proceso), auto_drop => TRUE, enabled => TRUE ); COMMIT; END; /
内容的提问来源于stack exchange,提问作者user2840273
相关产品推荐
相关产品推荐

