Как проверить статус успешного или неудачного внешнего задания через oracle Apex - PullRequest
0 голосов
/ 02 августа 2020

Моя версия базы данных - R11.2 и Apex 19.2. Я вызываю внешнее задание (сценарий оболочки) с помощью DBMS_SCHEDULER. Все работают нормально. Моя проблема заключается в том, как получить статус внешнего задания (сценарий оболочки: 0 -success 1-Error) на вершине oracle страницы и можно ли загрузить файл журнала сценария внешней оболочки или отобразить сообщение журнала сценария внешней оболочки на той же странице вершины?

Запрос SELECT * FROM dba_scheduler_job_log ГДЕ 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;

1 Ответ

1 голос
/ 02 августа 2020

Для типа EXECUTABLE DBMS_SCHEDULER требуется учетное имя пользователя, запускающего сценарий оболочки. Пока сценарий оболочки обрабатывает ошибку, API Планировщика завершится с ошибкой. Но вы не получите саму ошибку скрипта, а общее c сообщение 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 (12 c и далее) реле в подсистеме, отвечающей за выполнение задания. В этом случае STDERR или стандартная ошибка из Linux возвращает ошибку в API планировщика.

Я сам был в ситуации, когда APEX запускает задания, выполняемые DBMS_SCHEDULER. Чтобы показать настоящую ошибку, я разработал процесс загрузки файла журнала в таблицу и синтаксический анализ столбца, чтобы доставить сообщение журнала во внешний интерфейс APEX. Чтобы сделать его, так сказать, удобным для пользователя.

...