Сама оболочка запускает только команду и оценивает ее код выхода. Код нулевого выхода означает успех; все другие значения указывают на сбой.
if command; then
: things to do if the exit code from command was 0
else
: things to do if it was not 0
fi
while command; do
: things to do if the exit code was 0
done
Команда [
(aka test
) очень часто используется в условных выражениях, поскольку в исходной оболочке Bourne не было встроенных операторов, чтобы проверить, была ли строка пустым или файлом. У современных оболочек встроена эта команда, и у многих оболочек есть расширенная и модернизированная версия [[
, но это не является должным образом переносимым для POSIX sh
, и поэтому ее следует избегать для портативных скриптов. Этот связанный вопрос более подробно объясняет различия между ними.
Обозначение (( ... ))
вводит арифметический контекст. Опять же, это было не что-то, что не было частью оригинальной оболочки Bourne (для этого было специальное средство expr
), но в современных оболочках это встроено. Код результата арифметического выражения равен 0, если результат арифметическая оценка не была 0 (или ошибкой).
Обозначение ( command )
создает подоболочку и оценивает command
. Бывают ситуации, когда это действительно необходимо и полезно, но если вы просто изучаете синтаксис, вам вряд ли понадобится это.
... На самом деле, в большинстве сценариев я видел, что это использовалось в условном выражении, это явно не нужно.
Еще один антипаттерн, который нужно искать, -
command
if [ $? = 0 ]; then
: things
fi
Вы почти никогда не должны явно изучать $?
, и, в частности, сравнение его с нолем - это нечто if
и while
, особенно , для вас за кулисами. Это должно быть просто рефакторировано
if command; then
: ...
В версиях ниже 12c Oracle DBMS_JOB
и / или DBMS_SCHEDULER
будет планировать выполнение хранимой процедуры. Он может создать файл, но для этого вам потребуется пакет UTL_FILE
, а не SPOOL
.
Поскольку вы работаете в Oracle 12c, его DBMS_SCHEDULER
теперь предлагает новый тип задания - SQL_SCRIPT
, который позволяет планировать сценарий .SQL. Это означает, что код, который вы разместили, должен быть сохранен в виде файла. Я не могу создать пример на своем 11gXE, но вот ссылка на сайт ORACLE-BASE : https://oracle-base.com/articles/12c/scheduler-enhancements-12cr1 [ 119] и скопированный из него скрипт, который показывает, как это сделать:
CONN test/test@pdb1
-- Create a job with a SQL*Plus script defined in-line,
-- including an explicit connect.
SET SERVEROUTPUT ON
DECLARE
l_job_name VARCHAR2(30);
l_script VARCHAR2(32767);
BEGIN
l_job_name := DBMS_SCHEDULER.generate_job_name;
DBMS_OUTPUT.put_line('JOB_NAME=' || l_job_name);
-- Notice the explicit database connection in the script.
l_script := 'CONN test/test@pdb1
SPOOL /tmp/test.lst
SELECT SYSDATE, USER FROM dual;
SPOOL OFF';
DBMS_SCHEDULER.create_job(
job_name => l_job_name,
job_type => 'SQL_SCRIPT',
job_action => l_script,
credential_name => 'oracle_ol6_121',
enabled => TRUE
);
END;
/
В качестве альтернативы, вы можете использовать программу планирования вашей операционной системы (Task Scheduler в MS Windows) и сказать ей запускать скрипт .BAT, который установит соединение SQL * Plus и запустит скрипт .SQL, который содержит команду SPOOL
и оператор SELECT
.
Забыл сказать: я бы не стал вовлекать в это SQL Developer.