首页 > 解决方案 > 如何通过 oracle Apex 检查外部作业的成功或失败状态

问题描述

我的数据库版本是 R11.2 和 Apex 19.2。我正在使用 DBMS_SCHEDULER 调用外部作业(shell 脚本)。一切正常。我的问题是如何获取外部作业的状态(shell 脚本:0-成功 1 -错误)在 oracle apex 页面中,是否可以下载外部 shell 脚本日志文件或在同一 apex 页面中显示外部 shell 脚本的日志消息?

即使外部作业失败,查询 SELECT * FROM dba_scheduler_job_log WHERE job_name = 'MYJOBNAME' 也会显示“SUCCEEDED”。

 DBMS_SCHEDULER.CREATE_JOB(
 job_name => 'APEXDATA.myJobName',
 job_type => 'EXECUTABLE',
 job_action => '/tmp/1.sh',
 enabled => FALSE,
 repeat_interval => NULL);

从 Apex 页面执行以下命令

 begin
 dbms_scheduler.run_job(job_name => 'APEXDATA.myJobName', use_current_session=> TRUE);
 end;

标签: oracleoracle-apexoracle-apex-5oracle-apex-5.1

解决方案


DBMS_SCHEDULER 的 EXECUTABLE 类型需要运行 shell 脚本的用户的凭证名称。只要 shell 脚本正在处理错误,调度程序的 API 就会出错退出。但是您不会得到脚本本身的错误,而是 DBMS_SCHEDUELER 的一般消息。

让我向您展示 12.2 并输入 EXTERNAL_SCRIPT

SQL> select credential_name from dba_credentials ;

CREDENTIAL_NAME
--------------------------------------------------------------------------------
ORA_FTPFDM
ORA_FTPCPL

SQL> begin
  2  dbms_scheduler.create_job ( job_name => 'MY_TEST' , job_type => 'EXTERNAL_SCRIPT' , job_action => '/home/ftpcpl/test.sh' ,
  3  credential_name => 'ora_ftpcpl' , enabled => false );
  4* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> ! vi /home/ftpcpl/test.sh

SQL> host chmod +x /home/ftpcpl/test.sh

SQL> host cat /home/ftpcpl/test.sh
#!/bin/bash

var=1
echo $var

# control error

return=$?

if [[ $return -eq 0 ]]; then exit 0; else exit 99; fi

我们从 sqlplus 运行脚本并且它可以工作,以及调度程序作业

SQL> host /home/ftpcpl/test.sh
    1

SQL> host echo $?
0

SQL> exec dbms_scheduler.run_job ( 'MY_TEST' ) ;

PL/SQL procedure successfully completed.

现在让我们再次更改脚本以强制出错。

SQL>  host cat /home/ftpcpl/test.sh
#!/bin/bash

var=1
echo $var

# control error

return=99

if [[ $return -eq 0 ]]; then exit 0; else exit 99; fi

SQL> host vi /home/ftpcpl/test.sh

SQL> host /home/ftpcpl/test.sh
1

SQL> exec dbms_scheduler.run_job ( 'MY_TEST' ) ;
BEGIN dbms_scheduler.run_job ( 'MY_TEST' ) ; END;

*
ERROR at line 1:
ORA-27369: job of type EXECUTABLE failed with exit code: Cannot assign
requested address
ORA-06512: at "SYS.DBMS_ISCHED", line 238
ORA-06512: at "SYS.DBMS_SCHEDULER", line 568
ORA-06512: at line 1

结论:DBMS_SCHEDULER 使用作业类型 EXECUTABLE 或 EXTERNAL_SCRIPT(从 12c 开始)中继负责运行作业的子系统。在这种情况下,来自 Linux 的 STDERR 或标准错误会将错误返回给调度程序 API。

我自己处于 APEX 触发由 DBMS_SCHEDULER 运行的作业的情况。为了显示真正的错误,我设计了一个将日志文件上传到表并解析列的过程,以便将日志消息传递到 APEX 前端。为了使其用户友好,可以这么说。


推荐阅读