0

KornShell (ksh) で次のコマンドを実行しようとしています。

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" | awk '{print $1"."$2}'`

私が達成しようとしているのは、特定のテーブルのインデックスのリストを、後で反復できる配列に配置することです。

問題は、上記のコマンドを実行すると、配列の内容が「SQL1024N」というエラー メッセージで始まることです (これは、データベース接続が存在しないことを示しています)。

awkただし、ステートメントの最後にあるを削除すると、次のようになります。

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"`

それは問題なく動作します(まあ、データを返す範囲で。明らかにawk、正しいデータをキャプチャしていません)。

がなぜawkこのような影響を与えているのか誰か知っていますか?

このデータを取得する方法が複数あることは理解していますが、なぜこれが起こっているのかがわかりません。

前もって感謝します。

4

4 に答える 4

1

この場合、DB2 CLP がデータベースに接続されていないことを示しているのは、シェルが独自の専用 db2bp バックエンド プロセスを必要とするサブプロセスを開いたためであり、このサブプロセスは元のシェル プロセスによって開かれた接続にアクセスできません。何かが切断されているのではなく、新しく作成されたシェル プロセス (およびそれに付随する db2bp プロセス) が作成されていますが、データベースに接続するように指示されていません。これを解決する 1 つの方法は、これらの状況のいずれかにあることがわかっている場合に、データベースに明示的に接続 (または再接続) することです。

set -A INDEXES `db2 connect to watevrDB >/dev/null;db2 -x describe indexes for table ${TABSCHEMA}.${TABNAME} show detail | awk {'print $1"."$2'}`

この質問は、システム カタログよりも DB2 でのスクリプトと awk に関するものであることを理解しています。そうでなければ、同じ結果を生成するためにいくつかの簡単なカタログ クエリをお勧めします。

于 2009-06-19T20:15:40.323 に答える
1

それ自体がおかしいのではないかと思います。たぶん、db2 は stdout が tty またはコンソールに接続されていることにこだわるのでしょうか? または、少なくともパイプに接続されているときは好きではありません。

于 2009-02-04T10:19:21.263 に答える
0

これは珍しいもので、Pez が言うように、おそらく db2 の癖です。

たとえば、db2 コマンド文字列の前に time または timex を使用すると、db2 に接続先のデータベースが定義されていない場合に、同様の問題が発生します。

暗黙的な接続のデフォルト データベースを設定する環境変数 DB2DBDFT があります。申し訳ありませんが、DBA 以外のユーザーがこの変数を使用できるかどうかはわかりません (アプリ開発者であることが前提です)。次の方法でこの変数を設定する場合は、調査する価値があります。

db2set DB2DBDFT=${your_db_name}

そして、クエリを再試行します。

環境に接続できるデータベースが複数ある場合は、作業が完了したら DB2DBDFT 変数を設定解除できます。

于 2009-02-04T18:44:00.777 に答える
0

-x スイッチを指定して db2 コマンドを試してください。

db2 **-x** "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"....

これにより、出力を awk にパイプできないことが治った例がありました。

于 2009-02-11T13:17:39.697 に答える