今回のHackは、yumパッケージの1つであるdb2utilを使ってシェル上で簡単にSQLを発行する方法をご紹介します。SQLの発行は、Access Client Solutions(以下、ACS)ならばRUN SQL Scirpt、5250エミュレータならばSTRSQLです。では、SHELLでは? ここで、db2utilの登場です。db2utilで何ができるのか見てみましょう。
まだyumをインストールしていない方は、当コラム「ushiday@Hackな日々|当面のテーマはyum(牛田吉樹)」でインストール方法を紹介していますので、先にインストールをお願いします。
前提
今回の説明では、前提として以下の環境が必要です。
・IBM iにSSH接続している端末
・yum本体が導入済み
・シェルの環境変数$PATHに、/QOpenSys/pkgs/bin/が入っている
1.db2utilのインストール
次のコマンドを実行するとdb2utilがインストールされます。ACSでインストールも可能です。こちらは画面から選ぶだけです。
yum install db2util(*本記事では、V1.0.12-1を使用しています)
パッケージ「db2util」のインストールを確認
ACS:「ツール」→「オープン・ソース・パッケージ管理」で確認できます。
また、ターミナルを使用する場合はyum listコマンドで確認することができます。
yum list | grep db2util
db2util.ppc64 1.0.12-1 @ibm
2.db2utilの使用方法
db2utilコマンドを利用します。書式:db2util [オプション] SQLステートメント
オプション | 説明 |
---|---|
-o 出力形式 | 出力する形式を指定します。json、csv、スペース区切りのいずれか *指定がない場合はcsv形式になります |
-p パラメータ | 入力パラメータを指定します |
-h | ヘルプを表示します |
-v | パッケージのバージョンを表示します |
db2utilコマンドではSQLを投げることができるので、いろいろなデータベース操作が可能ですが、今回は、単純なデータ取得を例にします。たとえば、ある範囲のデータを出力したい場合は、以下のように実行します(-oオプションを指定することで出力形式の指定も可能です)。
たとえば以下のようにすると、選択条件に該当するデータがCSV出力されます。
db2util “SELECT * FROM QIWS.QCUSTCDT LIMIT 5”
“938472”,”HENNING “,”G K”,”4859 ELM AVE”,”DALLAS”,”TX”,”75217″,”5000″,”3″,”37.00″,”0.00″
“839283”,”JONES “,”B D”,”21B NW 135 ST”,”CLAY”,”NY”,”13041″,”400″,”1″,”100.00″,”0.00″
“392859”,”VINE “,”S S”,”PO BOX 79″,”BROTON”,”VT”,”5046″,”700″,”1″,”439.00″,”0.00″
“938485”,”JOHNSON “,”J A”,”3 ALPINE WAY “,”HELEN “,”GA”,”30545″,”9999″,”2″,”3987.50″,”33.50″
“397267”,”TYRON “,”W E”,”13 MYRTLE DR”,”HECTOR”,”NY”,”14841″,”1000″,”1″,”0.00″,”0.00″
出力をJSON形式にする場合は、-o jsonを指定します。
db2util -o json “SELECT * FROM QIWS.QCUSTCDT LIMIT 5”
{“records”:[
{“CUSNUM”:938472,”LSTNAM”:”HENNING “,”INIT”:”G K”,”STREET”:”4859 ELM AVE “,”CITY”:”DALLAS”,”STATE”:”TX”,”ZIPCOD”:75217,”CDTLMT”:5000,”CHGCOD”:3,”BALDUE”:37.00,”CDTDUE”:0.00},
…省略…
]}
さらにJSON形式をrecords以下の配列のみ出力したい場合は、環境変数DB2UTIL_JSON_CONTAINERにarrayをセットします。デフォルトのオブジェクト出力にする場合はobjectをセットします。
export DB2UTIL_JSON_CONTAINER=array
db2util -o json “SELECT * FROM QIWS.QCUSTCDT LIMIT 5”
[
{“CUSNUM”:938472,”LSTNAM”:”HENNING “,”INIT”:”G K”,”STREET”:”4859 ELM AVE “,”CITY”:”DALLAS”,”STATE”:”TX”,”ZIPCOD”:75217,”CDTLMT”:5000,”CHGCOD”:3,”BALDUE”:37.00,”CDTDUE”:0.00},
…省略…
]
また、db2utilコマンドは以下のように-pオプションを指定し、実行することでSQLの条件に入力パラメータを受け取ることも可能です。-pオプションで渡せるパラメータの最大数は32個までとなっています。
db2util -o json -p 2 “SELECT * FROM QIWS.QCUSTCDT LIMIT ?”
[
{“CUSNUM”:938472,”LSTNAM”:”HENNING “,”INIT”:”G K”,”STREET”:”4859 ELM AVE “,”CITY”:”DALLAS”,”STATE”:”TX”,”ZIPCOD”:75217,”CDTLMT”:5000,”CHGCOD”:3,”BALDUE”:37.00,”CDTDUE”:0.00},
{“CUSNUM”:839283,”LSTNAM”:”JONES “,”INIT”:”B D”,”STREET”:”21B NW 135 ST”,”CITY”:”CLAY “,”STATE”:”NY”,”ZIPCOD”:13041,”CDTLMT”:400,”CHGCOD”:1,”BALDUE”:100.00,”CDTDUE”:0.00}
]
3.db2utilの活用例
たとえば、db2utilの標準出力の内容を、リダイレクト > or >> の指定によってcsvやjson形式でファイル出力することができます。またQP2SHELLを使用して、CLプログラム内で処理を実行することも可能です。方法としては、①直接CL内でdb2utilを呼び出す(SBMJOBでジョブの切り離しが必要)、②シェルスクリプトを作成し、作成したシェルスクリプトを実行する、などが考えられます。
github上にサンプルコードを掲載しておきます(https://github.com/ushiday/imag_ushiday_Hack/tree/main/008)。
②の例
PGM
/*————————————–*/
/*変数定義*/
/*————————————–*/
DCLVAR(&X00)TYPE(*CHAR)LEN(001)VALUE(X’00’)/*Null*/
DCLVAR(&CMD)TYPE(*CHAR)LEN(256)/*コマンド*/
DCLVAR(&P01)TYPE(*CHAR)LEN(064)/*引数01*/
DCLVAR(&P02)TYPE(*CHAR)LEN(064)/*引数02*/
/*変数設定*/
CHGVARVAR(&P01)VALUE(+
‘5’+
||&X00+
)
CHGVARVAR(&P02)VALUE(+
‘/tmp/ushiday@hack-82.json’+
||&X00+
)
CHGVARVAR(&CMD)VALUE(+
‘/home/ushiday/src/ushiday@hack/iMag_202303- 008+
/sample.sh’+
||&X00+
)
/*環境変数設定*/
CALLPGM(QP2SHELL)PARM( +
&CMD +
&P01 +
&P02 +
)
RETURN
ENDPGM
最後に
今回は、シェルでSQLを実行できる便利な「db2util」とその活用例を紹介しました。便利なyumパッケージはたくさんあるので、皆さんぜひ使ってみてください、それじゃ、また次回に!
著者
牛田 吉樹氏
株式会社中部システム
代表取締役社長
2001年中部システム入社。RPG技術者として数多くの受託開発案件を担当。その一方、オープンソースの習得も並行して進め、コミュニティ活動にも積極的に参加する。PHP、JavaScript、Node.jsなどに造詣が深い。TwitterやQiitaなどでも積極的に発言。2021年より現職。
[i Magazine・IS magazine]