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ステートメント)について最初に理解することは、Informixではなく、DB-Access、I4GL、ISQLなどのクライアントプログラムによって実装されていることです。適切な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(コンパクト)表記でタイムスタンプを生成します。次に、シェル「ヒアドキュメント」を使用して、DB-Accessに供給されるファイル名を生成します。表記では${DATABASE:-default_db}、環境変数$DATABASEで指定されたデータベースが使用されますが、設定されていない場合はdefault_db、データベース名として使用されます。

この例では、シェルによって展開されるタイムスタンプを除いて、ヒアドキュメントには何もありません。実際、SQLは通常、問題を引き起こす可能性のあるシェルのメタ文字(主にドルとバッククォート)から十分に離れています。したがって、通常は心配する必要はありません。

于 2013-01-25T14:45:58.283 に答える