Отчет об успешном / неудачном выполнении оператора SQL с помощью файла .sql и SQL * Plus - PullRequest
1 голос
/ 13 сентября 2011

Я тот же парень, который спросил:

BEGIN / END и CREATE Таблица в одном файле .sql

Во всяком случае, у нас есть несколько сценариев .sql, которые мы выполняем с помощью SQL * Plus.

Эти сценарии используются для создания таблиц, синонимов, индексов, представлений и т. Д.

В одном файле .sql обычно содержится несколько операторов CREATE.

То, что мы ищем, - это способ сообщить о том, прошел / не прошел каждый оператор CREATE, а также сообщение об ошибке, если оно не удалось.

Create table foo: Pass
Create index bar: Fail - Reason...
Create synonym foo_1: Pass etc.

В настоящее время мы можем анализировать выходные данные SQL * Plus, однако в них есть много посторонних вещей, и синтаксический анализ файла журнала, подобного этому, не самый надежный подход.

Есть ли лучший способ программно проверять состояние возврата каждого оператора SQL через SQL Plus и сообщение об ошибке, если оно есть? Это что-то достижимое с SQL Plus?

Или мне нужно написать какую-нибудь оболочку (Bash, Python и т. Д.)? Или справиться с этим по-другому?

Cheers, Victor

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Лично мне не нравится встраивать логику в сценарии DDL, за исключением случаев, когда это абсолютно необходимо (сценарий может стать слишком сложным, а его действие менее предсказуемым)

Я предпочитаю сканировать выходные данные сценария на наличие ошибок, например:grep для строки ORA-

Затем убедитесь, что в схеме нет недопустимых объектов

2 голосов
/ 13 сентября 2011

Если вы хотите продолжить работу со сценарием SQL при возникновении ошибки, вам следует создать таблицы и индексы из блока PL / SQL, поскольку PL / SQL имеет достойную обработку исключений:

BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE XY ( ... )';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Creating table XY failed: ' || SQLERRM);
END;
/

Если вы хотите завершить текущий сценарий SQL при возникновении ошибки, вы можете использовать следующую команду SQL * Plus и выполнить обработку ошибок в сценарии с именем SQL * plus:

whenever sqlerror exit sql.sqlcode
...