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

Posted

技术标签:

【中文标题】Informix 外部表传递文件名作为参数【英文标题】:Informix external table pass file name as parameter 【发布时间】:2018-05-03 17:46:53 【问题描述】:

我在 Informix 中有一个存储过程,它使用外部表从 select 语句将数据卸载到磁盘文件。是否可以将磁盘文件名作为参数提供给存储过程?我的存储过程如下:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢。我会试试你的解决方案。 您的解决方案有效。我忘了我可以使用 execute immediate stmt 来执行动态语句。【参考方案2】:

我对我的代码进行了轻微更改以卸载数据(作为 Informix 默认的“|”分隔字段)。我能够直接在外部表中动态选择列,而不是使用临时表。

【讨论】:

以上是关于Informix 外部表传递文件名作为参数的主要内容,如果未能解决你的问题,请参考以下文章

Azure Synapse 外部表位置参数化

Informix:如何将单个参数中的多个值传递、使用和执行到存储过程

在 informix 触发器中传递连接的字符串参数

shell如何传递外部参数给文件

如何使用 javascript 将外部链接作为 url 参数传递? [复制]

如何在 Informix 中打开和读取文件