Внешняя таблица Informix передает имя файла в качестве параметра - PullRequest
0 голосов
/ 03 мая 2018

У меня есть хранимая процедура в Informix, которая использует внешние таблицы для выгрузки данных в файл на диске из оператора select. Можно ли дать имя файла DISK в качестве параметра хранимой процедуре? Моя хранимая процедура выглядит следующим образом:

create procedure spUnloadData(file_name_param varchar(64))

create temp table temp_1(
        col_11 smallint
    ) with no log;

    INSERT INTO temp_1 select col1 from data_table;

    CREATE EXTERNAL TABLE temp1_ext 
    SAMEAS temp_1
    USING (
        --DATAFILES ("DISK:/home/informix/temp.dat") 
          DATAFILES("DISK:" || file_name_param )
        );

    INSERT INTO temp1_ext SELECT * FROM temp_1;

    DROP  TABLE temp1_ext ;
    DROP  TABLE temp_1;

END PROCEDURE;

Я пытаюсь передать имя файла DISK в качестве параметра (из моего сценария оболочки с отметкой времени). Любая помощь приветствуется. NH

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Я внес небольшие изменения в свой код для выгрузки данных (как разделенные Informix поля по умолчанию '|'). Вместо того, чтобы использовать временную таблицу, я мог динамически выбирать столбцы во внешней таблице.

0 голосов
/ 03 мая 2018

Вам потребуется использовать динамический SQL в хранимой процедуре - например, оператор EXECUTE IMMEDIATE .

Вы создаете строку, содержащую текст SQL, а затем выполняете ее. Адаптация вашего кода:

CREATE PROCEDURE spUnloadData(file_name_param VARCHAR(64))

    DEFINE stmt VARCHAR(255);  -- LVARCHAR might be safer

    CREATE TEMP TABLE temp_1(
        col_11 SMALLINT
    ) WITH NO LOG;

    INSERT INTO temp_1 select col1 from data_table;

    LET stmt = 'CREATE EXTERNAL TABLE temp1_ext ' ||
               'SAMEAS temp_1 USING  DATAFILES("DISK:' ||
               TRIM(file_name_param) ||
               '")';
    EXECUTE IMMEDIATE stmt;

    INSERT INTO temp1_ext SELECT * FROM temp_1;

    DROP TABLE temp1_ext;
    DROP TABLE temp_1;

END PROCEDURE;

Непроверенный код - концепция должна быть разумной.

Предполагается, что вы используете достаточно свежую версию Informix; необходимая функция есть в 12.10, и, как мне кажется, в некоторых версиях версии 11.70.

...