表はどこにあるのか
それは苛立ちとともに始まりました。私はそれを改善要望としては簡単なものだと考えました。すなわち、「私のSQL照会が読み取ったのはどのファイルなのか」 私は「SQLスクリプトの実行」ツールを使用して、非修飾表名でSQL照会を修正していました。ところが、ファイルのスキーマ(ライブラリー)名を判別する、すぐに使える方法を私は知りませんでした。先ほど照会したばかりの表がどの表なのかを、私はどうやって知ることになったのでしょうか。
少し話を戻すと、私が選んだSQLクライアントは、IBMのAccess Client Solutions(ACS)の一部である、「SQLスクリプトの実行」ツールです。RPGプログラムまたはビューから「SQLスクリプトの実行」にSQL SELECTステートメントをコピー&ペーストして、必要に応じてそのステートメントを修正し、元々そのステートメントがあったソース メンバーに修正したステートメントをコピー&ペーストして戻すのは、私にとって珍しいことではありません。
数年前、私はある照会で作業していて、予想した結果が得られていませんでした。その時、もしかしたら、1つ以上の表が、私がアクセスしていると思っていたライブラリーとは別のライブラリーにあるのではないかという考えが思い浮かびました。しかし、どのようにしたら分かるのでしょうか。メニューを調べてみましたが、すぐに役立ちそうな情報を見つけられませんでした。
方法はいくつかあります。まずは、Visual Explainです。
私の疑問に対する答えはそこにありますが、いろいろと準備が大変で、しばらく時間が掛かる可能性もあります。
F4キーおよびCtl+Spaceもあります。それらはリストを示してくれますが、私の疑問には答えてくれません。
私が望んでいたのは、メッセージ パネルにメッセージを表示することでした。そして、そのことは、簡単なCLプログラムとコマンド インターフェースによってたやすく実現されました。私は、それをFLと名付けました。File Locationの略です。
以下は、そのコマンド インターフェースです。
/* Command: FL - File location */
/* Program: FLC */
/* Show what library a file is in from Run SQL Scripts */
/* Example from Run SQL Scripts */
/* Input: cl:FL customers; */
/* Output: CPF9897: THH1/CUSTOMERS *FILE *PF */
/* */
/* To create: */
/* CRTCMD CMD(/FL) */
/* PGM(*LIBL/FLC) */
/* SRCFILE(/QCMDSRC) */
/* SRCMBR(FL) */
CMD PROMPT('File location')
PARM OBJ TYPE(Q1) min(1) PROMPT('Object')
Q1: QUAL TYPE(*NAME) MIN(1) EXPR(*YES)
QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) +
EXPR(*YES) PROMPT('Library')
以下は、CLソースです。
/* Send a message to tell what library a file is in. */
/* CPP for command FL */
pgm (&iQualObj)
dcl &iQualObj *char 20
dcl &ObjName *char 10
dcl &ObjLib *char 10
dcl &Msg *char 132
dcl &MsgType *char 10 '*INFO'
dcl &FileAtr *char 3
dcl &Text *char 50
monmsg cpf0000 exec(goto Abend)
chgvar &ObjName %sst(&iQualObj 1 10)
chgvar &ObjLib %sst(&iQualObj 11 10)
if (&ObjLib *eq ' ' *or %sst(&ObjLib 1 1) *eq '*') do
rtvobjd &ObjLib/&ObjName ObjType(*file) +
RtnLib(&ObjLib) Text(&Text)
enddo
RtvMbrD &ObjLib/&ObjName FileAtr(&FileAtr)
if (&FileAtr *ne ' ') do
ChgVar &Msg &FileAtr
enddo
chgvar &Msg (%trimr(&ObjLib) *cat '/' *cat +
%trimr(&ObjName) *cat ' ' *cat +
*FILE *cat ' ' *cat +
%trimr(&Msg) *cat ' ' *cat +
&Text)
SndPgmMsg MsgID(CPF9897) MsgF(QCPFMSG) +
MsgDta(&MSG) MsgType(&MsgType)
return
Abend:
call QMHRSNEM parm(' ' x'00000000')
return
endpgm
決して洗練されたコードではありませんが、私はほんの数分でそれをささっと作り、それは問題なく機能します。私は通知メッセージ(MSGTYPE(*INFO))として送信しましたが、完了メッセージでも同様に機能します。
この小さなツールを書いてからかなり長い時間(1年以上)が経った頃、私は自分の疑問に対する答えに偶然出くわしました。ある日、照会結果グリッドが、列ごとに使用されているスキーマを示していることにたまたま気付きました。これは、新しいウィンドウで結果セットを開いていても、そうでなくても当てはまります。「View」、「Details」を選択すればよいのです。
私は、またしても「車輪の再発明(無駄な努力)」をしていたわけですが、検索エンジンで簡単に疑問に答えてもらえない場合は、数分掛けてツールをささっと作るのは賢明なことかもしれません。私がそうだったように、後になって、疑問の答えとなる機能が前からずっとあったことが分かる場合もあるかもしれません。自分で書いたツールはその時点で、処分するのも残しておくのも、好きなようにすればよいでしょう。
IBMは、そのうちAI対応の「SQLスクリプトの実行」をリリースすると思います。「select * from customers where . . .」の代わりに、「~である顧客をリストして」と文章で指示することができるようになるでしょう。「SQLスクリプトの実行」は、英語(あるいはどの言語でも)の文章の照会からSELECTステートメントを作成し、そのステートメントを実行するようになるでしょう。きっとそうなります。
また、たとえば、「顧客の表は、どのようなスキーマにありますか」などというような質問を尋ねられるようにもなるでしょう。その時までは、私はちょっとした簡単なツールを書いて、紹介し続けるつもりです。あるいは、少なくとも、皆さんに考える種を提供しようと思っています。
