5

我正在尝试将查询结果存储在文件中。以下命令完成此任务:

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

4

1 回答 1

4

关于 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 元字符(主要是美元和反引号)。因此,这通常不是您需要担心的事情。

于 2013-01-25T14:45:58.283 回答