oracle - 如何通过 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;
解决方案
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 前端。为了使其用户友好,可以这么说。
推荐阅读
- javascript - 使用 addEventListener() 方法从表单重定向页面
- php - 我的登录表单在身份验证后返回相同的表单,我的 LDAP 连接不工作
- r - 如何在表上运行此功能?
- apache-kafka - Consumer Aware 呼吁消费者线程安全
- eclipse - 如何为 Eclipse 设置 Docker 容器?
- actions-on-google - 操作审批流程是否需要请求同步功能
- swift - Firebase 与 SwiftUI 的集成
- fortran - 具有滑动访问的 MPI 共享内存通信
- powerquery - 如何逐步通过 M 中的评估函数
- powershell - powershell 调试:脚本与本地、全局和自动