Informix外部表传递文件名作为参数

时间:2018-05-03 17:46:53

标签: informix

我在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文件名作为参数(来自我的shell脚本,已加时间戳)。 任何帮助表示赞赏。 NH

2 个答案:

答案 0 :(得分:1)

您必须在存储过程中使用Dynamic 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版本。

答案 1 :(得分:0)

我对我的代码稍作修改以卸载数据(因为Informix默认的'|'分隔字段)。我没有使用临时表,而是能够动态地将列直接选择到外部表中。