はじめに
IRISで登録したデータを取得する方法の1つとして、SQLがあります。
IRISで簡易的にSQLを実行する場合、管理ポータルかターミナルが上げられます。
- データの参照が目的 → 管理ポータル
- データの出力が目的 → ターミナル
こんな使い分けのイメージです。
今回は、ターミナルでのSQL運用をご紹介いたします。
:sql
cache時代のユーザは、下記コマンドをターミナルで実行して、SQL実行環境に変えていたと思います。
d $System.SQL.Shell()
IRISでは、「:sql」でOKです!
※ ver.2022.1から確認 それ以前は不明です。
:sql
いやー、楽になったなぁ・・・
たった4文字入力するだけですからね。
さて、「:sql」をターミナルで実行すると、下記文言が表示されます。
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
SQL実行モードを解除する場合は、「quit」コマンドを実行します。
さて、ではSQLを実行していきましょう。
サンプルとして下記クラスを作成して、5,000件程データを作成しました。
developer.data.Sample Extends %Persistent
{
Index idx On code;
Property code As %String;
Property name As %String;
Property document As %String;
Property flg As %Boolean;
Property number As %Integer;
Storage Default
{
<Data name="SampleDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>code</Value>
</Value>
<Value name="3">
<Value>name</Value>
</Value>
<Value name="4">
<Value>document</Value>
</Value>
<Value name="5">
<Value>flg</Value>
</Value>
<Value name="6">
<Value>number</Value>
</Value>
</Data>
<DataLocation>^developer.data.SampleD</DataLocation>
<DefaultData>SampleDefaultData</DefaultData>
<ExtentSize>5000</ExtentSize>
<IdLocation>^developer.data.SampleD</IdLocation>
<IndexLocation>^developer.data.SampleI</IndexLocation>
<StreamLocation>^developer.data.SampleS</StreamLocation>
<Type>%Storage.Persistent</Type>
}
}
SQLの実行
単行でクエリを実行する
例えば、条件「number=418003358」のレコードに対し、「code,name」を取得するには、下記クエリをターミナルに打ち込みます。
select code,name from developer_data.Sample where number=418003358
[SQL]SAMPLE>>select code,name from developer_data.Sample where number=418003358
結果は下記になります。
2. select code,name from developer_data.Sample where number=418003358
code name
B659 Young,William F.
1 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.1645s/35,926/195,179/0ms
execute time(s)/globals/cmds/disk: 0.0431s/5,001/36,125/0ms
cached query class: %sqlcq.SAMPLE.cls5
---------------------------------------------------------------------------
ここで、「number」に他の値も入れて検索したい!と考えます。
毎回毎回、number=まで削除して別の数値を入れるのは非常に手間です。
その場合、「number=?」として実行します。
select code,name from developer_data.Sample where number=?
[SQL]SAMPLE>>select code,name from developer_data.Sample where number=?
実行後、ターミナルには下記文言が表示されます。
ここで、他の数値「561516167」を入力してみましょう。
3. select code,name from developer_data.Sample where number=?
Enter the value for parameter '1':
Enter the value for parameter '1': 561516167
executing statement with parameter values: set %tResult=%tStatement.%Execute(561516167)
code name
W58 Sverdlov,Peter I.
1 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.1582s/35,932/193,048/36ms
execute time(s)/globals/cmds/disk: 0.0091s/5,001/36,170/0ms
cached query class: %sqlcq.SAMPLE.cls6
---------------------------------------------------------------------------
「number=561516167」で検索された事が分かります。
またまた別の数値で検索したい場合は、十字キーの「↑」を2回入力すると、検索したクエリが再表示されるので、苦労せず別の数値で検索が可能になります。
汎用的に使えて便利ですよね。
この条件を「?」で代替する方法は、管理ポータルやロジック中でも使えるので、是非試してみて下さい。
複数行で実行する
where句が複雑になったりselect句が大量にある場合、クエリを単行で実行しようとすると、クエリがとても見にくくなります。
そこで、クエリ実行モードに移った時にEnterキーをクリックして下さい。
[SQL]SAMPLE>> << entering multiline statement mode, 'GO' to execute >>
1>>
「1>>」と表示されれば、複数行モードです。
この状態では、EnterをクリックしてもSQLは実行されません。
クエリを入力した後、「GO」を入力する事で実行されます。
では、試してみましょう。
[SQL]SAMPLE>> << entering multiline statement mode, 'GO' to execute >>
1>>select
2>> code,name
3>>from
4>> developer_data.Sample
5>>where
6>> flg = 1
7>> & document like '%ss%'
8>>go
最後に「go」と打ち込んでEnterをクリックする事で、クエリが実行致します。
実行結果は下記でした。
730件検索が行われたことが分かります。
....(略)
I4464 Quixote,Violet O.
730 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.1801s/36,445/225,882/0ms
execute time(s)/globals/cmds/disk: 0.0911s/5,001/101,843/0ms
cached query class: %sqlcq.SAMPLE.cls7
---------------------------------------------------------------------------
複数クエリでも、「?」は有効です。
今回は、複数個使用してみました。
[SQL]SAMPLE>> << entering multiline statement mode, 'GO' to execute >>
1>>select
2>> code,name
3>>from
4>> developer_data.Sample
5>>where
6>> flg = ?
7>> & document like ?
8>>go
3. select
code,name
from
developer_data.Sample
where
flg = ?
& document like ?
Enter the value for parameter '1': 1
Enter the value for parameter '2': %Ass%
最初に出現した「?」を1として、以降「?」が出現する度に順次番号が振られます。
該当する「?」と番号に注意して値を入力していきます。
....(略)
I4464 Quixote,Violet O.
730 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.1766s/36,451/223,614/0ms
execute time(s)/globals/cmds/disk: 0.1389s/5,001/101,857/0ms
cached query class: %sqlcq.SAMPLE.cls8
---------------------------------------------------------------------------
730件検索出来ましたね。
終わりに
ターミナルでSQLを実行するのは少々癖があり、操作がし難い面もあります。
ただ、ターミナルをロギングしておけば、クエリ結果の出力が容易に行えるのが利点ですね。
# ファイル > ロギング 若しくは 「Alt + L」
select句の各項目も「タブ区切り」で出力されるので、Excelにそのままペタッと貼れます。
データの抽出等も行う際は、是非ご利用下さい!