MENU

ushiday@Hackな日々|yum-db2utilを使う(牛田吉樹)

ushiday@Hackな日々

今回の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]