2010.01.08
 

改善されたDB2コマンド

db2 コマンドが QShell で使用できるようになってほしいと本当に思います。これは、パラメーターとして受信される SQL ステートメントを実行する単純なシェル・コマンドです。SQL SELECT ステートメントまたは CALL ステートメントからの結果セットも戻します。このツールは QShell ばかりでなく、CL プログラムでも役に立ちます。CL には、他の ILE 言語と違い自分の組み込み SQL がないためです。

残念ながら、QShell の db2 コマンドには多少詳細情報が欠けています。小さなことですが、プログラミング・ツールとしての価値を著しく損なう原因となります。コマンドが失敗しても、その他の QShell ユーティリティーと違いその出口ステータス経由で障害は報告されず、そのためエラー処理が非常に難しくなっています。また、ネイティブ・アプリケーションで幅広く採用されているシステム命名規則もサポートされていません。つまり、ライブラリー・リストが使用できないということです。望む、望まないに関わらず、常に列見出し情報が出力されます。これらの制限には本当に頭が痛くなります。そこで代用ということで、自分のユーティリティーを作成しました。私のユーティリティーは QShell ツールとまったく同じように動作するよう作られていますが、これらの問題を解決し、いくつか新機能を追加している点で QShell ツールとは異なります。

IBM db2 QShell ユーティリティーについてへき易する点をいくつか挙げます。

  • 成功しようと失敗しようと、出口ステータスは常に 0 を戻す。これは、IBM が提供する他のすべての QShell ツールと異なっています。その他のツールでは、成功した場合は出口ステータスは 0、失敗した場合はゼロ以外の値を戻します。
  • エラーが検出されると、標準出力にエラー・メッセージが印刷される。他のすべての QShell ツールは標準エラーにエラーを印刷します。
  • システム命名規則がサポートされていない。ライブラリー・リストを使用するにはシステム規則が必要で、これが私にとって大きな悩みの種となっています。
  • 列見出し、レコード・カウントなどが出力から削除しにくい。

「sql,」と名付けた私のバージョンではこれらの問題は解決されています。これは ILE C で作成された通常の ILE プログラムです (できるなら RPG を使用したいのですが、状況的に C を使用する方が簡単でした)。前述の問題すべてが解決します。理由は次のとおりです。

  • すべてのステートメントが成功した場合のみ出口ステータスが 0 に設定される。
  • エラー・メッセージが標準エラーに印刷される。
  • システム命名規則がサポートされている。
  • 列見出しおよび他のテキストを削除するのに単純なコマンド・スイッチが提供されている。

つまり、次のようにエラー処理できるようになったということです。

ADDENVVAR ENVVAR(QIBM_QSH_CMD_ESCAPE_MSG) VALUE(Y) REPLACE(*YES)
STRQSH CMD('sql "select prod, desc from itmmast"')
MONMSG MSGID(QSH0000) EXEC(DO)
/* code to run if SQL statement failed in error */
ENDDO

上記の問題を解決しただけでなく、次のように便利と思われる新機能をいくつか追加しています。

  • 列見出しおよび類似情報を完全に削除できる。
  • 各行の先頭、各行の終わり、各見出しの間に配置するストリングを提供できる。これにより、タブで区切られた CSV または XML ファイルさえ簡単に生成できます。
  • コマンド・ラインから複数の SQL ステートメントを実行できる。
  • ステートメントの先頭に - を付けて、プログラムにその特定のステートメントの障害を無視させることができる。

例えば、新しいツールでは次のことが可能になり、CSV ファイルが作成されます。

sql -QqS -b '"' -a'"' -c '","' "select * from custmas"

-b (before) スイッチは各レコードの前にストリングを印刷します。同様に、-a は各レコードの後にストリングを印刷します。-c (column) は列の間にテキストを印刷します。これにより、上記のような区切りファイルが簡単に生成できます。

同じ手法で HTML ファイルを生成できます。

export HTML /home/klemscot/test.html
echo '<html><body><table style="border-collapse: collapse">' > $HTML

sql -SQq -b "<tr><td>" -a "</td></tr>" -c "</td><td>"
"select improd, imdesc from itmmast" >> $HTML

echo "</body></html>" >> $HTML

当然、HTML タグの代わりに XML タグを使用すると、XML 文書が作成されます。悪くないでしょう?

この新しい QShell ユーティリティーを実行し、-h を唯一のパラメーターとして渡すと、コマンドを簡単に使用できるようコマンドのヘルプが一部印刷されます。次のようなヘルプが印刷されます。

Usage: sql -h = display help
   or sql [-vqQWS] [-t | -d | -T<char>] [-r RDBNAME [-u USER] -p PASS] ]
       [-b STRING] [-a STRING] [-c STRING] "statement; statement ..."
   or sql [-vqQWS] [-t | -d | -T<char>] [-r RDBNAME [-u USER] -p PASS] ]
       [-b STRING] [-a STRING] [-c STRING] -f FILENAME DEFAULT_LIB [LIBL]

最初の構文 (-h 指定) により、このヘルプ・ファイルが表示されます。

2 番目の構文は、コマンド・ラインで提供された sql ステートメントを実行します。ステートメントが複数の場合は、セミコロンまたは -t、-d、または -T で指定されたもので区切ることができます。@ で始まるステートメントは CL コマンドとして実行され、他のステートメントは SQL ステートメントとして実行されます。

3 番目の構文は、スクリプト・ファイルで提供された sql ステートメントを実行します。ステートメントが複数の場合は、新しい行 (または -t、-d、または -T で指定されたもの) で区切られています。-- またはステートメント・セパレーターで始まる行はコメントです。@ で始まる行は CL コマンドで、その他は SQL ステートメントです。FILENAME の構文は IFS でなければなりません。FILENAME が - の場合、ステートメントは stdin から読み取られます。DEFAULT_LIB が指定されている場合、非修飾ファイル名のデフォルト・ライブラリーになります。-Q が指定されている場合、デフォルト・ライブラリーの後にスペースで区切られたライブラリー・リストも指定できます。

プログラムのオプションは次のとおりです。

  • -v = 実行前に各ステートメントを印刷
  • -t = ステートメント・セパレーターとしてセミコロンを使用 (デフォルト)
  • -d = ステートメント・セパレーターとしてバン (感嘆符) を使用
  • -T = ステートメント・セパレーターとして<char>を使用
  • -q = 抑止モード。列見出しは省略。
  • -Q = 修飾オブジェクト構文を使用 (命名 =*SYS)
  • -W = 警告メッセージを抑止 (警告ではなくエラーを示す)
  • -S = 列に並んだ空白を抑止し、末尾ブランクをカット
  • -a = 各レコードの後に印刷されたストリング。デフォルト =NONE
  • -b = 各レコードの前に印刷されたストリング。デフォルト =NONE
  • -c = 各列の間に印刷されたストリング。デフォルト =" "
  • -r = RDBNAME データベースへの接続
  • -u = (-r が指定されている場合) ユーザー・プロファイル USERNAME を使用
  • -p = (-p が指定されている場合) パスワード PASSWORD を使用

-f = は FILENAME からコマンドを読み取ります。非修飾テーブルにはライブラリー DEFAULT_LIB を使用します。修飾命名を使用する場合は、オプションでライブラリー・リストを追加できます。

ソース・コードとインストール手順はここからダウンロードできます。
お役に立てればと思います。

ページトップ

ボタン