如何使用DBMS_SCHEDULER链作业中的参数运行批处理文件

时间:2016-11-16 13:17:23

标签: batch-file plsql oracle11g dbms-scheduler

案例:
我有Windows批处理文件start.bat,它使用从外部传递的extr_mode参数执行一些操作:

rem settings
  set extr_mode=%1

rem the rest of the script

当我从cmd使用即:start.bat DAILY调用它时,它工作正常并传递参数。

现在我正试图在DBMS_SCHEDULER连锁工作的程序下调用这个批处理文件:

begin
  sys.dbms_scheduler.create_program(program_name        => 'OUT_BAT',
                                    program_type        => 'EXECUTABLE',
                                    program_action      => 'C:\Job\start.bat DAILY',
                                    number_of_arguments => 0,
                                    enabled             => true,
                                    comments            => 'Out batch file');
end;
/

这个没有参数(program_action => 'C:\Job\start.bat')的程序运行正常,但是当我添加参数作业失败时。
我的意思是,我正在检查dba_scheduler_job_run_details和此步骤STATUS = SUCCEEDED,但在ADDITIONAL_INFO中有:

CHAIN_LOG_ID="490364", STEP_NAME="OUT", STANDARD_ERROR="The system cannot find the path specified.
The system cannot find the path specified."

我的问题没有找到任何具体的答案,那么是否可以使用DBMS_SCHEDULER连锁工作的参数运行批处理文件?

2 个答案:

答案 0 :(得分:1)

坦率地说,我不知道dbms-scheduler。

当然,批次可以提供解决方案,这可能适合也可能不适合。

创建一个名为startDAILY.bat的新批处理,其中包含以下内容:

C:\ Job \ start.bat DAILY

并更改您的设置

program_action      => 'C:\Job\startDAILY.bat'

我对你的代码行陈述

表示怀疑
  

number_of_arguments => 0,

我怀疑你可以改变一下来说number_of_arguments => 1,

然后很好 - 或许dbms-scheduler手册可能会提示如何提供DAILY作为第一个参数,以便您可以使用原始代码。

哦BTW - 使用start作为批处理名称并不是一个好主意,因为START是批处理关键字。

答案 1 :(得分:0)

问题解决了 - 感谢提示@Magoo,

我需要先创建program

sys.dbms_scheduler.create_program(program_name          => 'OUT_BAT',
                                    program_type        => 'EXECUTABLE',
                                    program_action      => 'C:\OUT_start.bat',
                                    number_of_arguments => 1,
                                    enabled             => false,
                                    comments            => 'Out batch file');

然后定义program argument并启用程序:

sys.dbms_scheduler.define_program_argument(program_name          => 'OUT_BAT',
                                             argument_position   => 1,
                                             argument_name       => 'DAILY',
                                             argument_type       => 'varchar2',
                                             default_value       => 'DAILY');

sys.dbms_scheduler.enable(name => 'OUT_BAT');

然后当然是dbms_scheduler job的其余元素。