我在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
您必须在存储过程中使用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版本。
我对我的代码进行了轻微更改以卸载数据(因为Informix默认的'|'分隔字段)。我没有使用临时表,而是能够动态地将列直接选择到外部表中。