如何通过oracleApex检查外部作业的成功或失败状态



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

查询SELECT*FROM dba_scheduler_job_log WHERE job_name='MYJOBNAME'显示";"成功";甚至外部作业也失败了。

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;

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前端。可以说是为了方便用户。

最新更新