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 11.5 SQL 语句性能监控方法及实现

Informix SQL / 在另一个查询中重用存储过程的结果

Informix SQL 11.5 — 在 while 循环中访问变量

Informix SQL 查询:返回不同结果的两个相似查询

Informix SQL - 简单选择查询返回意外结果