主題の質問をいただきまして。
こんなコマンドがあるとは知らなんだー、ありがとうMさん♪
QUERY/400定義 *QRYDFN をSQL文に変換出力するコマンド RTVQMQRY
参考URL:
Converting Query/400 Queries to SQL
RTVQMQRY (QUERY 管理機能プログラム検索) コマンド ※IBM i 7.5版は執筆時点で英語のため7.4リンクです
RTVQMQRY概要
QUERY/400定義 *QRYDFN または QUERY管理機能プログラム *QMQRY 読取り、SQL文に変換して出力ファイルに書き込みます。
※作成する出力ファイルの桁数はSRCPFデフォルトの92としています。
RTVQMQRYコマンド使用例① (かんたんな*QRYDFNからSQL文を生成)
事前にSQL出力ファイル(例ではQSQLSRC)を作成します。
CRTSRCPF FILE(DEMOLIB/QSQLSRC) IGCDTA(*YES)
CRTSRCPF FILE(DEMOLIB/QSQLSRC) IGCDTA(*YES)
次にRTVQMQRYコマンドを実行します。
サンプルは、単純にDb2 for i テーブル名(ビュー名)だけを指定したものです。
画像では見えませんが、DEMOLIB/HINMSPを指定しています。
実行結果は下記のように10個のカラムのデータが表示されます。
RTVQMQRYを実行します。
RTVQMQRY QMQRY(DEMOLIB/HINMSP) SRCFILE(DEMOLIB/QSQLSRC) SRCMBR(*QMQRY) ALWQRYDFN(*YES)
ポイントはQRYDFNからの情報使用可能ALWQRYDFNパラメーターをYESにすることです*
コマンド名を見ると分かるようにこのコマンドは本来、QUERY管理機能プログラム=オブジェクトタイプ *QMQRYを検索してSQL文を書き出すコマンドだからです。
出力結果を確認すると、、
SELECT文が生成されています。
では、このコマンドをACS SQL実行画面にコピペして実行してみます。
失敗しましたT T)
理由はライブラリー/ファイル名になっているからでした。うーむ、これSQLネイティブ形式出力も指定可能にしてほしいですね。
気を取り直してライブラリー名.ファイル名に修正実行すると、、
実行されました!
RTVQMQRYコマンド使用例② (やや複雑めな*QRYDFNからSQL文を生成)
次にちょっと複雑な指定をしたQRYDFNからSQL生成をやってみます。
テーブルは1と同じHINMSPです。
売上-原価=粗利 ARARIフィールドを追加
カラムを指定、表示順の変更下記のようにいくつかのフィールドを除外、順番並べ替えをしました。
原価 GENKA が2,000円以上のレコードのみ選択します
以上のQRYDFNを保管します。実行結果は下記のようになります。
それでは、RTVQMQRYコマンドで上記QUERY/400定義をSQL文に変換出力してみます。
RTVQMQRY QMQRY(DEMOLIB/HINMSP_Q2) SRCFILE(DEMOLIB/QSQLSRC) SRCMBR(*QMQRY) ALWQRYDFN(*YES)
生成されたSQL文はコチラです。
ライブラリー/ファイル名をライブラリー.ファイルに修正してACS SQLスクリプト実行してみます。
結果を比較すると、QUERY/400と同様なようです。
RTVQMQRYコマンドコマンド使用例③ さらに条件を追加してみる
使用例②に加えてさらに条件を加えてみます。
分類フィールド(ソート順)を、粗利ARARI 降順、仕入先番号HNVEND 昇順 を指定
カラムヘッダーが2列のものは1列に修正
現実的な意味合いはありませんが、計算機能1~5を追加
以上を設定してQUERY/400を実行してみると下記のような結果が返ります。
・ソート順が、ARARI降順→仕入先番号照準
・カラムヘッダーは1行になった
・計算機能1-5(合計、平均、最大、最小、レコード数)はすべて正常計算されました。
RTVQMQRYコマンドでこのQUERY/400定義 *QRYDFNをリトリーブしてみます。以下の結果になりました。計算機能などは省略された(出力されていない)ようです。
ACS SQLで実行します。結果はQUERY/400と同様なようです。(のぞく計算機能)粗利 ARARIカラムもヘッダーを設定していない為別な値が入っています。
SQL出力ファイルのレコード長の検証
SQL文を書き出すPFのレコード長は92桁以上であれば大丈夫なようです。
SQL文を出力した事後にDSPFFDコマンドで確認するとSQL出力ファイル中に3つのフィールド(カラム)が生成されています。
SRCPFのレコード長を伸ばすと、SRCDTAのレコード長が大きくなります。
ですが、SQL文の出力桁数は固定のようで80桁前後で折り返されてしまうようです。一方、SQL出力ファイルの桁数が小さいと出力されたSQL文の一部がSQL出力ファイルに保管されない場合がありました。
SQL出力ファイルレコード長:92 基本形とします。
SQL出力ファイルレコード長:132 桁数が伸びても出力桁数は92の場合と同様。スクショでは切れていますが右端に日付6桁が入っています。
SQL出力ファイルレコード長:79 HNNSUR, が抜けてしまいました
よってSQL出力ファイルのレコード長を長くとってもあまり意味が無い& (ひとまず)92より短いといけないようです。
QUERY/400定義がSQL文に落とせるか?のチェックコマンド ANZQRYコマンド
QUERY/400定義 *QRYDFN をSQL文に落とした際のエラー有無をチェックできます。
使い方は
ANZQRY QRY(DEMOLIB/HINMSP_Q3)
のように*QRYDFN名を指定し実行します。
考察:今後の、IBM i アプリ資産(ソースコードやIBM i上のオブジェクトの定義)のSQL化、オープン化について
こちらの記事Source Orbit:ソース・オービット IBM i のアプリコードDevOps・可視化ツールにもあるように、今後どんどん、
- IBM iのアプリ資産をGitなど外部リポジトリで管理できるようにする
- IBM iのアプリ資産をSQLベースに移行していく
ということが言えそうです。
※細かい所調べきれてないのでまた追記したいと思います。