【发布时间】:2022-07-08 14:50:50
【问题描述】:
我目前正在寻找从 Oracle 运行一个外部程序(目标是来自触发器,但我正在测试只是让它暂时手动工作)。
也许我遗漏了什么,这是我一步一步做的:
- 创建了一个 .bat 文件,只需打印一行 (C:\TEMP\printline.bat),这就是我希望 Oracle 执行的内容(目前)。
文件内容为:
@echo off
echo Oracle call done !!
pause
- 使用此命令将程序添加到“程序列表或 Oracle”中:
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
program_name => 'TEST_EXE',
program_type => 'EXECUTABLE',
program_action => 'C:\TEMP\printline.bat',
enabled => TRUE
);
END;
/
我可以看到它很好地插入到了 DBA_SCHEDULER_PROGRAMS 表中。
- 经过多次研究,您似乎没有像 DBMS_SCHEDULER.RUN_PROGRAM 这样的命令,您“必须”吗?用工作来做,所以我创建了一个,我尝试了这两种方法:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'TEST_EXE_JOB',
program_name => 'TEST_EXE',
enabled => TRUE,
repeat_interval => 'freq=yearly',
start_date => SYSDATE);
END;
/
begin
dbms_scheduler.create_job (
job_name => 'TEST_EXE_JOB',
job_type => 'EXECUTABLE',
job_action => 'C:\TEMP\printline.bat',
enabled => true,
repeat_interval => 'freq=yearly',
start_date => SYSDATE);
end;
/
我每年设置一次频率,因为无论如何我都想手动运行程序,如果我将其设置为 NULL,则不会创建作业。
- 使用这两个条目中的任何一个,我都会使用以下命令手动运行作业:
begin
dbms_scheduler.run_job (job_name => 'TEST_EXE_JOB');
end;
/
Oracle 说 PL/SQL 调用做得很好,我可以查看表 DBA_SCHEDULER_JOB_RUN_DETAILS 有一条日志行说调用成功了,但是服务器上什么也没发生, .bat 文件尚未执行。
我还必须启动 Windows 服务 OracleJobSchedulerORCL 才能成功调用。如果我不启动它,我会收到此错误:
ORA-27370: échec du lancement d'un travail de type EXECUTABLE par le travail esclave
ORA-27300: opération dépendante du système d'exploitation : échec de accessing job scheduler service avec l'état 2
ORA-27301: message d'erreur du système d'exploitation : The system cannot find the file specified.
ORA-27302: une erreur s'est produite à : sjsec 5
ORA-27303: informations supplémentaires : The system cannot find the file specified.
ORA-06512: à "SYS.DBMS_ISCHED", ligne 231
ORA-06512: à "SYS.DBMS_SCHEDULER", ligne 568
ORA-06512: à ligne 2
27370. 00000 - "job slave failed to launch a job of type EXECUTABLE"
*Cause: The scheduler ran into an error when the job slave tried to start
a job of type EXECUTABLE. The rest of the error stack will provide
more detailed information on what the exact problem was.
*Action: Correct the problem specified in the error stack and reschedule
the job.
- 我还发现了一些关于 {ORA_HOME}\rdbms\admin\externaljob.ora 的消息,但没有太多解释。看起来像是管理外部调用的权限,但我不明白它是如何工作的。
所以这里有一些问题:
- 为什么我必须使用工作和频率?没有办法手动调用程序吗?
- Oracle 说作业调用成功,但没有按预期发生。我是否缺少某些权限配置或其他内容?
- 有没有更简单的方法让 Oracle 运行外部程序?
任何帮助将不胜感激。
非常感谢。
【问题讨论】:
-
请记住,bat 文件将在启动 OracleJobSchedulerORCL 服务的帐户下运行,这意味着它永远不会出现在您的桌面上。为了进行测试,请将其写入文件(在上述帐户具有 r/w 访问权限的位置)。您可能还需要将操作设为 cmd.exe,并将批处理文件的路径作为参数传递给它。
-
我检查了服务使用的帐户,发现“NT SERVICE\OracleJobSchedulerORCL”帐户。所以我更改了设置以使该帐户具有读取和执行权限,但它没有任何改变。我用“Hello World”控制台应用程序替换了我的 .bat 文件,并休眠了 5 秒。现在,当我运行作业时,我看到在 Windows 任务管理器中执行了控制台,并在 Oracle 端看到了成功结果。所以我认为我的问题已经解决了 :-) 但这是正确的使用方式吗?手动运行计划作业?是否可以创建未计划的 Oracle 作业?我觉得很奇怪……
-
这是常用的方法,不确定是否有其他更新的替代方法。
标签: oracle batch-file executable external