【问题标题】:How can I make an Oracle database run an external program on Windows Server?如何让 Oracle 数据库在 Windows Server 上运行外部程序?
【发布时间】: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


【解决方案1】:

运行 OS 命令的一个简单机制是挂钩外部表中的 PREPROCESSOR 选项。你可以这样:

SQL> create table my_table (
  2   output varchar2(64)
  3  )
  4  organization external
  5  (  type oracle_loader
  6     default directory temp
  7     access parameters
  8     ( records delimited by newline
  9       preprocessor  temp:'run_os.bat'
 10     )
 11     location ( temp:'run_os.bat' )
 12  ) reject limit unlimited ;

然后将你想要的任何东西放在“run_os.bat”中。

在我的 YouTube 频道https://youtu.be/kMknfeGa6Ug上有一个完整的演练视频

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2021-09-18
    • 2014-04-16
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多