はじめに
実行する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
ステートメントを数値として取得できます。
よく使うステートメントを抜粋しました。
戻り値 | ステートメント名 |
---|---|
1 | select |
2 | update |
3 | delete |
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 | カラム名 |
isRowId | 1:レコード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 | 結果のカラム数 |
%SQLCODE | 0:正常に終了, 100:データが見つからないorデータの最後まで到達, 他:エラー |
%ROWID | INSERT時の最後のレコードID |
%StatementTypeName | 1: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データのご紹介でした。