Informix SQL 11.5 将查询结果存储在具有动态名称的文件中
Posted
技术标签:
【中文标题】Informix SQL 11.5 将查询结果存储在具有动态名称的文件中【英文标题】:Informix SQL 11.5 storing query results in a file with a dynamic name 【发布时间】:2013-01-25 10:05:47 【问题描述】:我正在尝试将查询结果存储在文件中。下面的命令完成了这个任务:
UNLOAD TO '/usr/data/report.csv' DELIMITER ';'
SELECT COUNT(*) FROM table1;
问题:我不想在每次执行查询时都覆盖文件 (report.csv)。
问题:如何在 UNLOAD TO 文件名参数中包含时间戳或日期?
已尝试但无法正常工作:
UNLOAD TO ('/usr/data/report_' || (SELECT REPLACE(TODAY, '.', '_') FROM systables WHERE tabid = 1) || '.csv') DELIMITER ';'
SELECT COUNT(*) FROM table1;
显示的错误信息:
#
# 809: SQL Syntax error has occurred.
#
版本:Informix SQL 11.50
【问题讨论】:
【参考方案1】:首先要意识到 UNLOAD 语句(也是 LOAD 语句 - 以及 INFO 和 OUTPUT 语句)是(它们是)由客户端程序(例如 DB-Access 或 I4GL 或 ISQL)实现,而不是由 Informix DBMS 提供。也就是说,DB-Access 程序读取命令并对其进行操作。特别是,数据库服务器永远不会看到“文件相关”部分——语句的UNLOAD TO 'file' DELIMITER ';'
部分;只有 SELECT 部分被发送到 DBMS。因此,您不能在其中使用 SQL 连接;实际上,您只能在其中写入文字文件名(在 DB-Access 中;I4GL 允许文件名使用变量)。
我会做你所追求的方式是:
#!/bin/sh
timestamp=$(date +'%Y%m%d.%H%M%S')
dbaccess $DATABASE:-default_db - << EOF
UNLOAD TO 'report-$timestamp.csv' DELIMITER ';'
SELECT COUNT(*) FROM table1;
EOF
这使用date
命令以 ISO 8601(紧凑)表示法生成时间戳。然后它使用 shell 'here document' 生成提供给 DB-Access 的文件名。 $DATABASE:-default_db
表示法使用由环境变量 $DATABASE
命名的数据库,但如果未设置,则使用 default_db
作为数据库名称。
在这个例子中,除了将被 shell 扩展的时间戳之外,here 文档中没有任何内容。事实上,SQL 通常远离可能引起麻烦的 shell 元字符(主要是美元和反引号)。所以这通常不是你需要担心的。
【讨论】:
您好,感谢您的回答。我不想弄乱 shell 脚本,因为我使用的客户端应用程序不允许服务器访问。但我会尝试一下,并报告我的解决方案。 如果你不能直接运行shell脚本,但可以运行DB-Access和一个脚本,你可能不得不使用DB-Access中的shell转义机制。您可以编写以!
开头的一行和一个命令,在脚本运行模式下,它将执行(但不是在UI 模式下)。您将卸载到固定名称,然后使用 !
重命名固定名称:UNLOAD TO 'report.csv'...; !mv report.csv report-$(date +%Y%m%d.%H%M%S).csv
(用换行符代替分号。
谢谢。我获得了服务器访问权限,您的回答有效。以上是关于Informix SQL 11.5 将查询结果存储在具有动态名称的文件中的主要内容,如果未能解决你的问题,请参考以下文章
Informix SQL 11.5 创建没有临时表的存储过程
Informix SQL / 在另一个查询中重用存储过程的结果