Для типа 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. Чтобы сделать его, так сказать, удобным для пользователя.