LoginSignup
1
2

(QA)IBM i QUERY/400定義をSQL文に変換したい

Last updated at Posted at 2024-05-23

主題の質問をいただきまして。
こんなコマンドがあるとは知らなんだー、ありがとう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文に変換して出力ファイルに書き込みます。
image.png
※作成する出力ファイルの桁数はSRCPFデフォルトの92としています。

RTVQMQRYコマンド使用例① (かんたんな*QRYDFNからSQL文を生成)

事前にSQL出力ファイル(例ではQSQLSRC)を作成します。

CRTSRCPF FILE(DEMOLIB/QSQLSRC) IGCDTA(*YES)

CRTSRCPF FILE(DEMOLIB/QSQLSRC) IGCDTA(*YES)

image.png

次にRTVQMQRYコマンドを実行します。
サンプルは、単純にDb2 for i テーブル名(ビュー名)だけを指定したものです。
画像では見えませんが、DEMOLIB/HINMSPを指定しています。
image.png
実行結果は下記のように10個のカラムのデータが表示されます。
image.png

RTVQMQRYを実行します。

RTVQMQRY QMQRY(DEMOLIB/HINMSP) SRCFILE(DEMOLIB/QSQLSRC) SRCMBR(*QMQRY) ALWQRYDFN(*YES)

image.png
ポイントはQRYDFNからの情報使用可能ALWQRYDFNパラメーターをYESにすることです*
コマンド名を見ると分かるようにこのコマンドは本来、QUERY管理機能プログラム=オブジェクトタイプ *QMQRYを検索してSQL文を書き出すコマンドだからです。

出力結果を確認すると、、
image.png
SELECT文が生成されています。

では、このコマンドをACS SQL実行画面にコピペして実行してみます。
image.png
失敗しましたT T)
理由はライブラリー/ファイル名になっているからでした。うーむ、これSQLネイティブ形式出力も指定可能にしてほしいですね。
気を取り直してライブラリー名.ファイル名に修正実行すると、、
image.png
実行されました!

RTVQMQRYコマンド使用例② (やや複雑めな*QRYDFNからSQL文を生成)

次にちょっと複雑な指定をしたQRYDFNからSQL生成をやってみます。
テーブルは1と同じHINMSPです。
売上-原価=粗利 ARARIフィールドを追加
image.png
カラムを指定、表示順の変更下記のようにいくつかのフィールドを除外、順番並べ替えをしました。
image.png
原価 GENKA が2,000円以上のレコードのみ選択します
image.png
以上の
QRYDFNを保管します。実行結果は下記のようになります。
image.png

それでは、RTVQMQRYコマンドで上記QUERY/400定義をSQL文に変換出力してみます。

RTVQMQRY QMQRY(DEMOLIB/HINMSP_Q2) SRCFILE(DEMOLIB/QSQLSRC) SRCMBR(*QMQRY) ALWQRYDFN(*YES)

image.png
生成されたSQL文はコチラです。
image.png
ライブラリー/ファイル名をライブラリー.ファイルに修正してACS SQLスクリプト実行してみます。
結果を比較すると、QUERY/400と同様なようです。
image.png

RTVQMQRYコマンドコマンド使用例③ さらに条件を追加してみる

使用例②に加えてさらに条件を加えてみます。
分類フィールド(ソート順)を、粗利ARARI 降順、仕入先番号HNVEND 昇順 を指定
image.png
カラムヘッダーが2列のものは1列に修正
image.png
現実的な意味合いはありませんが、計算機能1~5を追加

image.png
以上を設定してQUERY/400を実行してみると下記のような結果が返ります。
・ソート順が、ARARI降順→仕入先番号照準
・カラムヘッダーは1行になった
・計算機能1-5(合計、平均、最大、最小、レコード数)はすべて正常計算されました。
image.png

RTVQMQRYコマンドでこのQUERY/400定義 *QRYDFNをリトリーブしてみます。以下の結果になりました。計算機能などは省略された(出力されていない)ようです。
image.png

ACS SQLで実行します。結果はQUERY/400と同様なようです。(のぞく計算機能)粗利 ARARIカラムもヘッダーを設定していない為別な値が入っています。
image.png

SQL出力ファイルのレコード長の検証

SQL文を書き出すPFのレコード長は92桁以上であれば大丈夫なようです。
SQL文を出力した事後にDSPFFDコマンドで確認するとSQL出力ファイル中に3つのフィールド(カラム)が生成されています。
image.png
SRCPFのレコード長を伸ばすと、SRCDTAのレコード長が大きくなります。

ですが、SQL文の出力桁数は固定のようで80桁前後で折り返されてしまうようです。一方、SQL出力ファイルの桁数が小さいと出力されたSQL文の一部がSQL出力ファイルに保管されない場合がありました。
SQL出力ファイルレコード長:92 基本形とします。
image.png
SQL出力ファイルレコード長:132 桁数が伸びても出力桁数は92の場合と同様。スクショでは切れていますが右端に日付6桁が入っています。
image.png
SQL出力ファイルレコード長:79  HNNSUR, が抜けてしまいました
image.png

よって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ベースに移行していく
ということが言えそうです。

※細かい所調べきれてないのでまた追記したいと思います。

1
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2