我正在尝试将查询结果存储在文件中。以下命令可完成此任务:
UNLOAD TO '/usr/data/report.csv' DELIMITER ';'
SELECT COUNT(*) FROM table1;
Run Code Online (Sandbox Code Playgroud)
问题:我不想每次执行查询时都覆盖文件(report.csv)。
问题:如何在UNLOAD TO文件名参数中包括时间戳或日期?
已经尝试过,无法正常工作:
UNLOAD TO ('/usr/data/report_' || (SELECT REPLACE(TODAY, '.', '_') FROM systables WHERE tabid = 1) || '.csv') DELIMITER ';'
SELECT COUNT(*) FROM table1;
Run Code Online (Sandbox Code Playgroud)
显示错误信息:
#
# 809: SQL Syntax error has occurred.
#
Run Code Online (Sandbox Code Playgroud)
版本:Informix SQL 11.50
关于 UNLOAD 语句(也是 LOAD 语句 \xe2\x80\x94 以及 INFO 和 OUTPUT 语句),首先要认识到它是由 DB-Access 或 I4GL 或 ISQL 等客户端程序实现的,而不是 Informix DBMS 本身。也就是说,DB-Access 程序读取命令并对其执行操作。特别是“文件相关”部分 \xe2\x80\x94UNLOAD TO 'file' DELIMITER ';'语句 \xe2\x80\x94 的部分)数据库服务器永远不会看到;仅 SELECT 部分发送到 DBMS。因此,您不能在其中使用 SQL 连接;事实上,您只能在其中写入文字文件名(在 DB-Access 中;I4GL 允许文件名使用变量)。
我做你所追求的事情的方式是:
\n\n#!/bin/sh\n\ntimestamp=$(date +'%Y%m%d.%H%M%S')\ndbaccess ${DATABASE:-default_db} - << EOF\nUNLOAD TO 'report-$timestamp.csv' DELIMITER ';'\nSELECT COUNT(*) FROM table1;\nEOF\nRun Code Online (Sandbox Code Playgroud)\n\n这使用该date命令以 ISO 8601(紧凑)表示法生成时间戳。然后,它使用 shell“此处文档”生成提供给 DB-Access 的文件名。该${DATABASE:-default_db}表示法使用环境变量命名的数据库$DATABASE,但如果未设置,则用作default_db数据库名称。
在此示例中,除了将由 shell 扩展的时间戳之外,此处文档中没有任何内容。事实上,SQL 通常远离可能引起问题的 shell 元字符(主要是美元和反引号)。所以这通常不是您需要担心的事情。
\n| 归档时间: |
|
| 查看次数: |
14548 次 |
| 最近记录: |