SQLって便利ですよね。
QRY400も便利ですがSQLを使ったほうが色んなことができるので楽しいです。
データベースが自由自在。
ときに、あるSQL文をバッチで走らせたいなと思ったのですが、普通はCLプログラムから実行するはずなので、どうしたものかと。
私の知っている限りは、SQLはCLに書いても動きませんでした。
調べていたらEOL時代にやっていたQMQRYを使えばできるみたいなので備忘録を書いておきます。
お題
今回のお題は、溜まったログファイルを定期的に消すことです。
基本的にファイルは*NOMAXにしておらず、レコードの上限値でコンソールに確認メッセージが出るので定期的に消さないといけません。
よってSQLは、現在から過去1週間以前のレコードを削除するにしようと思います。
やり方の手順は、
- メンバーにSQLを書く
- QMQRYを作成する
- CLにQMQRYを実行する命令を書く
- 実行する
です。
ソースファイルを作る
今後も色々貯めていきたいので、それ用にソースファイルを作っておきます。
CRTSRCPF FILE(HOGELIB/QQMQRYSRC) RCDLEN(91) IGCDTA(*YES)
こんな感じになりました。PDMの画面です。真っさらなので当然メンバーはありません。
ソースメンバーにSQLを書く
「F6」を打鍵してSEUを立ち上げます。
作成するSQLに相応しい適当な名前をソースメンバー名とテキスト記述を付けます。ソース仕様タイプは触りません。
SQLはこんな感じです。CURRENT DATEで「2022-04-14」が取り出せるので、それをCHARで文字型にしてからREPLACEをしています。
-- 削除するSQLです DELETE FROM HOGELIB/HOGELOG WHERE DATE < REPLACE(CHAR(CURRENT DATE -7 DAY),'-','')
お作法をまとめました。
注意点です。
なるべくRunSQLScriptなどで動くかどうかを確かめてから組み込む方がスムーズです。
書き終わったら保存してSEUを終了です。
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オブジェクトが作成できました。
QMQRYを実行するコマンドをCLに書きます
QMQRYコマンドを実行するにはSTRQMQRYコマンドを使用します。
/* 構文 */ STRQMQRY QMQRY(HOGELIB/QMQRYオブジェクト)
こちらをCLに組み込むだけです。
こんな感じです。削除しただけでは容量は変わらないので再編成も組み込んでおきます。
PGM /* 削除プログラム SQL(QMQRY) */ STRQMQRY QMQRY(HOGELIB/DLTHOGEF) /* 再編成 */ RGZPFM HOGELIB/DLTHOGEF ENDPGM
完成
CL名は割愛しますが、これを実行すればうまく動きます。
SELECT文ならQRY400のような画面が表示されるので、何かを確認する場面に仕込んでおくのもいいかと思います。
動かなければSQLでエラーになっていないか確認しましょう。
補足
以下は補足です。
ソースメンバーを変更したときはCRTQMQRYを実行して、QMQRYを再作成しないといけません。
その際にすでにQMQRYオブジェクトが存在すれば、プログラムメッセージでG(Getin)か、C(Cancel)を聞かれますので、続行ならGで答えればOKです。
STRQMQRYで呼び出すCLはコンパイルし直さなくても大丈夫です。
コメント