【IRIS/Cache】【SQL】metaデータを取得する

はじめに

実行するSQLはどんなフィールドを出力するのか、検索されたレコード数は何件なのか、それらの情報は、metaデータとして取得する事ができます。

これでクエリの内容を把握しなくても、汎用的に実行し処理を行う事ができます。

今回は、meta情報の取得方法を簡単なサンプルと共にご紹介します。

%Prepareの後に取得するmetaデータ

metaデータを取得するタイミングは2回あり、最初に取得できるのは「%Prepare()」実行後、プロパティ「%Metadata」から取得する事になります。

取得したmetaデータの型は、「%SQL.StatementMetadata.cls」になります。

s stms = ##class(%SQL.Statement).%New(1)
d stms.%Prepare(.query)
	
// meta情報取得
s meta = stms.%Metadata

metaデータを参照する

ざっくばらんにmetaデータを参照したい場合は、関数「%Dispay()」でザックリ全体像が取得できます。

w meta.%Display()

statementType

w meta.statementType

ステートメントを数値として取得できます。
よく使うステートメントを抜粋しました。

戻り値ステートメント名
1select
2update
3delete

columnCount

w meta.columnCount

select句のカラム数を数値で返す。

columns

「%SQL.StatementColumn」の配列として格納されています。
配列なので、ループさせながらカラム情報を取得していきます。

s clms = meta.columns
s num = ""
f { s clm = clms.GetNext(.num) q:num=""
	w clm.colName,!
}

取得したオブジェクトから、下記の値等が取得できます。
 ※他にも色々取得可能です。

プロパティ名説明
clientTypeデータ型
colNameカラム名
isRowId1:レコードID
schemaNameスキーマ名
tableNameテーブル名

「%ToDynamicObject()」「%ToJSONValue()」等で、各パラメータを一気に取得する事も可能です。

parameterCount

w meta.parameterCount

where句の「?」の数を返します。

parameters

「%SQL.StatementParameter」の配列として格納されています。
配列なので、ループさせながらカラム情報を取得していきます。
 ※取得方法は「columns」と同じため割愛します。

objects

「%SQL.StatementObject」の配列として格納されています。
配列なので、ループさせながらカラム情報を取得していきます。
 ※取得方法は「columns」と同じため割愛します。

%Execute()の後に取得するmetaデータ

metaデータ取得タイミング2回目になります。

「%Execute()」を実行すると、戻り値として「%SQL.StatementResult.cls」を取得します。
ここからmeta情報を取得したいと思います。

プロパティ

metaデータ取得前に、「%SQL.StatementResult.cls」から取得できる情報をまとめました。

プロパティ名説明
%CurrentResultインスタンス化したクエリキャッシュ?(47@%sqlcq.SAMPLE.cls7等)
%Messageエラー時の追加情報
%ResultColumnCount結果のカラム数
%SQLCODE0:正常に終了, 100:データが見つからないorデータの最後まで到達, 他:エラー
%ROWIDINSERT時の最後のレコードID
%StatementTypeName1:SELECT, 2:INSERT, 3:UPDATE, 4:DELETE等々

「%SQLCODE」と「%ROWCOUNT」の値の変化をターミナルにて確認する。

s res = stms.%Execute(arg...)
w !,"%SQLCODE:"_res.%SQLCODE
w !,"%ROWCOUNT:"_res.%ROWCOUNT
w !,"---"
while( res.%Next() ){
	w !,"%ROWCOUNT:"_res.%ROWCOUNT
}
w !,"%SQLCODE:"_res.%SQLCODE

結果を確認してみる。

%SQLCODE:0
%ROWCOUNT:0
---
%ROWCOUNT:1
%ROWCOUNT:2
...
%ROWCOUNT:10
%SQLCODE:100

「%SQLCODE」は、実行前が0でループ終了後は100へと変化し、「%ROWCOUNT」は、現在の行数が取得できる。
ループ終了後は、「%ROWCOUNT=取得レコード数」と言える。

metaデータを取得する

さて、いよいよmetaデータ2回目の取得になります。

「%SQL.StatementResult.cls」からmetaデータを取得する方法は、関数「%GetMetadata()」を実行します。

s res = stms.%Execute(arg...)
s meta = res.%GetMetadata()

取得したmetaデータは、「%Prepare」と同じ「%SQL.StatementMetadata.cls」となります。
取得方法等は同じなため割愛します。

おわりに

ダイナミックSQLは色々な情報を含んで実行されるため、埋め込みSQLより若干処理が遅いのが分かりますね。

ただ、汎用性があるので、複雑な検索を実行する時は重宝します。
またmetaデータから得られる情報にも、かなりの価値があると考えています。

知っていれば、色々汎用的にロジックが組めるmetaデータのご紹介でした。