gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:13:47 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com