Выполнить содержимое файла Informix из файла - PullRequest
0 голосов
/ 28 сентября 2018

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

Итак, это код (все еще экспериментирующий):

DROP FUNCTION IF EXISTS "informix".SCRIPT_MIGRATION();

CREATE FUNCTION "informix".SCRIPT_MIGRATION()
RETURNS BOOLEAN as RESULT;

    DEFINE lv_execute lvarchar(32739);
    DEFINE li_errnum, li_eisam INT;
    DEFINE lv_errtxt CHAR(200);

    ON EXCEPTION SET li_errnum, li_eisam, lv_errtxt
        ROLLBACK;
            CALL regista_log('script_migration', get_session_user(), li_errnum, lv_errtxt);
        RETURN 'f';
    END EXCEPTION;

    CALL set_isolation_level();

    BEGIN;

    LET lv_execute = 'LOAD FROM ''C:\Users\Admin\Desktop\ConstaWeb_Stuff\test.sql'' DELIMITER ''+'' INSERT INTO SCRIPT_MIGRATION_TEMP_TABLE;';

    DROP TABLE IF EXISTS SCRIPT_MIGRATION_TEMP_TABLE;

    CREATE TABLE SCRIPT_MIGRATION_TEMP_TABLE(
        STRING_TO_EXECUTE LVARCHAR(31739)
    );

    EXECUTE IMMEDIATE lv_execute;


    COMMIT; 

    RETURN 't';
END FUNCTION;


CALL SCRIPT_MIGRATION();

Это потому, что мы, очевидно, не можем выполнить команду загрузки внутри функций.Поэтому я пытаюсь это выполнить.Но, по-видимому, я не совсем понял это. Цель здесь - выполнить сценарий (не сценарий командной оболочки! Это сценарий Informix, такой как создание, загрузка, выгрузка, удаление ...) файла.Я открыт для других способов сделать это.

Я относительно новичок в Informix, поэтому я уверен, что многое еще не знаю об этом.

1 Ответ

0 голосов
/ 29 сентября 2018

Как уже отмечалось, команда LOAD не является командой, распознаваемой сервером Informix.Клиентские продукты эмулируют оператор SQL, распознавая синтаксис, читая файл и выполняя соответствующие операторы SQL.Изменение того, как вы (пытаетесь) выполнить его в функции, выполняющейся на сервере, не поможет.

Вместо этого может помочь использование сценария оболочки.

Если вы переносите существующую базу данных Informixв новое место (компьютер, версия Informix), тогда использование DB-export и DB-Import может быть хорошим способом.

Команда DB-Access - это «стандартный» способ выполнения сценариев изскрипт оболочки.Вам необходимо убедиться, что для переменной среды DBACCNOIGN установлено значение 1.Затем он остановится, если во время ЗАГРУЗКИ возникнет ошибка, и откат транзакции.Также есть команда DB-Load, но будет сложнее откатывать операторы DDL, поскольку она не обрабатывает их.

В качестве альтернативы вы можете найти мой SQLCMD * программа полезна, хотя и не идеальна.Однако, в отличие от DB-Access, он позволяет вам контролировать, какие операторы могут генерировать ошибки, которые игнорируются, а какие нет (continue [on|off|push|pop]; до и после, в зависимости от ситуации).

С помощью аккуратной упаковки вы можете использовать ее для создания миграции, предполагая, что DB-Export и DB-Import не выполнят эту работу автоматически.

* Возможно, вам придется подписаться на IIUG, чтобы получить на это.Регистрация не обременительна, как и загрузка электронной почты.

...