【IRIS/Cache】【ターミナル】SQLを実行しよう!

はじめに

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にそのままペタッと貼れます。

データの抽出等も行う際は、是非ご利用下さい!