1

データベース内でシェルスクリプトを実行できるかどうか誰かに教えてもらえますか?

シナリオ:

データベースInformixを使用します。複数の挿入ステートメントを持つファイルにスクリプトがあります。データベース接続を開いています。いくつかの一時テーブルを作成し、いくつかの結合を実行します。データを一時テーブルにロードするには、その「ファイル」に挿入ステートメントが必要です。

質問:

データベースコンソール内のそのファイルでコマンドを実行できるようにする方法または回避策はありますか?いくつかの一時テーブルを作成しているため、データベース接続を閉じる余裕がありません。

4

1 に答える 1

7

コマンド ラインでデータベース接続にスクリプトを渡すには、次の手順を実行します。

dbaccess [databasename] file.sql

また

dbaccess filename.sql

(ファイルDATABASEの先頭にステートメントが含まれている場合。)

そのファイルの処理中にデータを挿入するには、ファイルに次のようなものが含まれていることを確認してください。

CREATE TEMP TABLE foo (bar INT, baz CHAR(10));
LOAD FROM "foodata.unl" DELIMITER "|"
INSERT INTO foo;

SELECT ...

元の回答に更新

SQLをシェルスクリプトに埋め込むには、「ヒアドキュメント」アプローチを使用できます。これは、あなたがほのめかしていると思います:

#!/bin/ksh

echo "Starting"

dbaccess << EOSQL

    DATABASE foo;

    CREATE TEMP TABLE foobar (foo INT, bar CHAR(10));
    LOAD FROM "foobar.unl" DELIMITER "|"
    INSERT INTO foobar;

    SELECT ...

    UPDATE ...

EOSQL

echo "Finished"

必要に応じて、スクリプトまたは環境変数を使用して、その SQL の動作を調整できるようになりました...

SELECT * FROM foobar WHERE bar > $VALUE;

where$VALUEは実行時にシェルによって補間され、ハードコードされているかのように Informix データベースに供給されます。

サブシェルプロセスを埋め込むことで、SQL 全体を注入することもできます...

dbaccess << EOSQL

    DATABASE foo;

    CREATE TEMP TABLE ...

    `cat $PATH_TO/some_more_sql_in_an_external_file.sql`

    UPDATE ...

EOSQL

そして、それでさえ dbaccess プロセスによって、ヒア ドキュメントの一部であるかのように扱われます (しかし、これはまれであり、率直に言ってかなり奇妙なことです)。

ただし、クエリに影響を与えるためにクエリを一時停止または中断したり、一時テーブルの内容を調べたり、何らかの方法で変更したりできるかどうかを尋ねている場合、答えはノーです。できません。

覚えておく価値のあるもう1つのトリック。環境変数DBACCNOIGNをゼロ以外の値に設定すると、ヒア ドキュメントの SQL 処理でエラーが発生すると、処理のチェーン全体が強制的に中止されます。dbaccess のデフォルトの動作は、エラーを報告して次のステートメントに移動することです。

それが役立つことを願っています。

于 2012-12-15T06:13:21.970 に答える