Планирование выполнения запроса по расписанию, которое экспортирует CSV в SQL Developer

Сама оболочка запускает только команду и оценивает ее код выхода. Код нулевого выхода означает успех; все другие значения указывают на сбой.

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
    : ...

0
задан Chris Hart 7 March 2019 в 17:09
поделиться

1 ответ

В версиях ниже 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.

0
ответ дан Littlefoot 7 March 2019 в 17:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: