Oracle 11g创建JOB执行服务器.bat文件失败求助
解决Oracle 11g中通过DBMS_SCHEDULER执行Windows批处理文件的问题
问题背景
要在Oracle 11g中创建JOB,执行服务器上的批处理文件,批处理内容如下:
@echo off echo Hello World pause
尝试了两种JOB写法均失败:
写法一
BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'TEST_BAT', job_type => 'EXECUTABLE', job_action => 'host cmd /c D:\Report\TEST.bat', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY; BYHOUR=12; BYMINUTE=0; BYSECOND=0', enabled => TRUE ); END; /
写法二
BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB( job_name => 'TEST_BAT', job_type => 'EXECUTABLE', job_action => 'C:\WINDOWS\system32\cmd.exe', comments => 'Job to call batch script on Windows', auto_drop => FALSE, number_of_arguments => 1, enabled => FALSE); SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'TEST_BAT', argument_position => 1, argument_value => 'D:\Tests\Export\TEST.bat'); SYS.DBMS_SCHEDULER.ENABLE( 'TEST_BAT' ); END; /
错误日志
ORA-27370: job slave failed to launch a job of type EXECUTABLE
ORA-27300: OS system dependent operation:accessing job scheduler service failed with status: 109
ORA-27301: OS failure message: The system cannot find the file specified.
ORA-27302: failure occurred at: sjsec 9
ORA-27303: additional information: The system cannot find the file specified.
问题分析与解决方案
核心问题点
- 写法一完全错误:
EXECUTABLE类型的JOB要求job_action直接指向系统可执行文件路径,host是SQL*Plus专属命令,无法被调度器识别。 - 路径不一致:两种写法中批处理文件路径分别为
D:\Report\TEST.bat和D:\Tests\Export\TEST.bat,需确保使用数据库服务器上真实存在的路径。 - 参数缺失:调用
cmd.exe时必须传入/c参数,用于指定执行批处理后自动退出,仅传入批处理路径无法触发执行逻辑。 - 无交互环境冲突:批处理中的
pause命令会导致进程在无交互界面下挂起,必须移除。 - 32/64位兼容性:若Oracle为32位、Windows为64位,需调用
C:\WINDOWS\SysWOW64\cmd.exe(系统会将32位进程对system32的访问重定向到SysWOW64目录)。
修正后的JOB代码
BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB( job_name => 'TEST_BAT', job_type => 'EXECUTABLE', job_action => 'C:\WINDOWS\SysWOW64\cmd.exe', -- 32位Oracle用此路径,64位Oracle改用C:\WINDOWS\system32\cmd.exe comments => 'Execute batch script on Windows server', auto_drop => FALSE, number_of_arguments => 2, enabled => FALSE ); -- 传入cmd.exe的执行参数:/c 表示执行批处理后自动退出 SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'TEST_BAT', argument_position => 1, argument_value => '/c' ); -- 传入批处理文件的完整路径(需确保数据库服务器上真实存在) SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'TEST_BAT', argument_position => 2, argument_value => 'D:\Tests\Export\TEST.bat' ); SYS.DBMS_SCHEDULER.ENABLE( 'TEST_BAT' ); END; /
额外注意事项
- 权限验证:确保Oracle服务运行的系统账户(如
OracleServiceORCL对应的账户)拥有批处理文件所在目录的读取、执行权限。 - 带空格的路径处理:若批处理路径包含空格,需用引号包裹,写法为
'"D:\My Batch Files\TEST.bat"'(PL/SQL中嵌套引号需用两个单引号转义)。 - 输出捕获:若需查看
echo Hello World的输出,需将批处理的输出重定向到文件,例如修改批处理为:@echo off echo Hello World > D:\Tests\Export\output.log
内容的提问来源于stack exchange,提问作者Italex
相关产品推荐
相关产品推荐

