AS400/IBMi CLからSQLを実行する

IT関連

SQLって便利ですよね。

QRY400も便利ですがSQLを使ったほうが色んなことができるので楽しいです。

データベースが自由自在。

 

ときに、あるSQL文をバッチで走らせたいなと思ったのですが、普通はCLプログラムから実行するはずなので、どうしたものかと。

私の知っている限りは、SQLはCLに書いても動きませんでした。

調べていたらEOL時代にやっていたQMQRYを使えばできるみたいなので備忘録を書いておきます。

 

お題

今回のお題は、溜まったログファイルを定期的に消すことです。

基本的にファイルは*NOMAXにしておらず、レコードの上限値でコンソールに確認メッセージが出るので定期的に消さないといけません。

よってSQLは、現在から過去1週間以前のレコードを削除するにしようと思います。

やり方の手順は、

  1. メンバーにSQLを書く
  2. QMQRYを作成する
  3. CLにQMQRYを実行する命令を書く
  4. 実行する

です。

データベースのライブラリとファイルはHOGELIB/HOGELOGとしておきます

ソースファイルを作る

今後も色々貯めていきたいので、それ用にソースファイルを作っておきます。

CRTSRCPF FILE(HOGELIB/QQMQRYSRC) RCDLEN(91) IGCDTA(*YES)

 

こんな感じになりました。PDMの画面です。真っさらなので当然メンバーはありません。

ソースメンバーにSQLを書く

「F6」を打鍵してSEUを立ち上げます。

作成するSQLに相応しい適当な名前をソースメンバー名とテキスト記述を付けます。ソース仕様タイプは触りません。

今回メンバー名は「DLTHOGEF」にします。

SQLはこんな感じです。CURRENT DATEで「2022-04-14」が取り出せるので、それをCHARで文字型にしてからREPLACEをしています。

-- 削除するSQLです
DELETE FROM HOGELIB/HOGELOG                           
WHERE DATE < REPLACE(CHAR(CURRENT DATE -7 DAY),'-','')

 

お作法をまとめました。

・構文はあくまでSQL構文です。
・コメントアウトは通常のSQLと同じハイフン2つで
・ライブラリとファイルの間はカンマではなくスラッシュで
・SQL文の最後のセミコロンは付けてはいけない
・CLで改行時に使う「+」は付けてはいけない

注意点です。

ソースメンバーはSQLの構文チェックが効かないので、間違ったSQL文を書いても保存できてしまいます。さらに間違ったSQL文でQMQRYの作成も出来てしまいます。

つまり
・間違ったSQL文を書いて保存する(エラーなし)
・CRTQMQRYでQMQRYを作成する(エラーなし)
・STRQMQRYでQMQRYを実行する(エラー判明)
になります。

SQLを動かして、動かないことで初めてエラーが判明します。

なるべくRunSQLScriptなどで動くかどうかを確かめてから組み込む方がスムーズです。

書き終わったら保存してSEUを終了です。

ライブラリ HOGELIB
ソースファイル QQMQRYSRC
ソースメンバー DLTHOGEF

QMQRYを作成する

CRTQMQRYコマンドをコマンドラインに入力して、QMQRYを作成します。

/* 構文 */
CRTQMQRY QMQRY(HOGELIB/オブジェクト名) SRCFILE(HOGELIB/QQMQRYSRC) SRCMBR(さっき作ったメンバー)

オブジェクト名とメンバー名は別で名前を付けられますが、同じにするなら下記になります。

CRTQMQRY QMQRY(HOGELIB/DLTHOGEF) SRCFILE(HOGELIB/QQMQRYSRC) SRCMBR(DLTHOGEF)

また、同じ名前であるなら下記のように省略可能です。

CRTQMQRY QMQRY(HOGELIB/DLTHOGEF) SRCFILE(HOGELIB/QQMQRYSRC)

 

これでQMQRYオブジェクトが作成できました。

ライブラリ HOGELIB
QMQRYオブジェクト DLTHOGEF

 

QMQRYを実行するコマンドをCLに書きます

QMQRYコマンドを実行するにはSTRQMQRYコマンドを使用します。

/* 構文 */
STRQMQRY QMQRY(HOGELIB/QMQRYオブジェクト)

こちらをCLに組み込むだけです。

こんな感じです。削除しただけでは容量は変わらないので再編成も組み込んでおきます。

 PGM                                    
                                        
     /* 削除プログラム SQL(QMQRY) */    
     STRQMQRY QMQRY(HOGELIB/DLTHOGEF)   
                                        
     /* 再編成 */                       
     RGZPFM HOGELIB/DLTHOGEF
                                        
 ENDPGM

 

完成

CL名は割愛しますが、これを実行すればうまく動きます。

SELECT文ならQRY400のような画面が表示されるので、何かを確認する場面に仕込んでおくのもいいかと思います。

動かなければSQLでエラーになっていないか確認しましょう。

 

補足

以下は補足です。

ソースメンバー(SQL)を変更した場合に必要な作業は?

ソースメンバーを変更したときはCRTQMQRYを実行して、QMQRYを再作成しないといけません。

その際にすでにQMQRYオブジェクトが存在すれば、プログラムメッセージでG(Getin)か、C(Cancel)を聞かれますので、続行ならGで答えればOKです。

CLのコンパイルはしなおさなくても大丈夫?

STRQMQRYで呼び出すCLはコンパイルし直さなくても大丈夫です。

 

コメント

タイトルとURLをコピーしました