sql - Informix SQL 11.5 将查询结果存储在具有动态名称的文件中

标签 sql informix

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

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

最佳答案

关于 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 元字符(主要是美元和反引号)。所以这通常不是你需要担心的。

关于sql - Informix SQL 11.5 将查询结果存储在具有动态名称的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519488/

相关文章:

database - 用于删除 IBM Informix 中表的前 100 行的数据库查询

java - 关于 Hibernate 和 Informix 的问题

java - 在哪里查找我的程序中第 331 行更新数据库语句中的错误

sql - PostgreSQL:使用窗口函数返回单行

c# - 将 varchar 转换为 char ?如何修复错误

sql - 如何调用 pl/sql 存储过程(函数,返回数值)?

sql - SQL 存储过程中的 "referencing old"和 "referencing new"有什么区别?

SQL在2个表相同主键中选择newst数据

linux - 如何使用 pyodbc/unixODBC 在 python3 中连接来自 Informix 数据库的选择数据

c++ - 我的 C++ 应用程序无法连接到 Informix DB 服务器