記事
Mihoko Iijima · 2021年2月12日 3m read

SQL から ObjectScript で記述したプログラムを実行して値を返す方法

これは InterSystems FAQ サイトの記事です。

以下例のクラスメソッド getLatestID() のように ObjectScript のクラスメソッドを用意します。
返したい値を戻り値に指定し、SQLストアドプロシージャ(SqlProc)キーワードを指定するだけで値が返せます。

ClassMethod getLatestID() As %Integer [ SqlName = getLatestID, SqlProc ]
{
    set latestID=$Order(^ISJ.TestClass1D(""),-1)
    quit latestID
}

 

操作を試す場合は、以下のクラス定義をご準備ください。

Class ISJ.TestClass1 Extends (%Persistent, %Populate)
{
Property name As %String;

ClassMethod getLatestID() As %Integer [ SqlName = getLatestID, SqlProc ]
{
    set latestID=$Order(^ISJ.TestClass1D(""),-1)
    quit latestID
}
}

 

データ自動生成を行うユーティリティクラス(%Populate)を継承しているため、Populate() メソッドを実行するとテストデータが作成できます。以下の例では、10件の ISJ.TestClass1 クラスに対応するデータを作成しています。

(USER ネームスペースに上記クラスを定義した状態での実行例)

USER>do ##class(ISJ.TestClass1).Populate(10)

 

作成したクラスメソッドをストアド関数として実行している例は以下の通りです。

(ターミナルをSQLの実行環境に変更してから SELECT文を実行している例です)

USER>do $system.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>select ISJ.getLatestID() As LatestID
1.      select ISJ.getLatestID() As LatestID

LatestID
10

1 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0545s/33171/145091/8ms
          execute time(s)/globals/cmds/disk: 0.0003s/1/415/0ms
                          cached query class: %sqlcq.USER.cls30
---------------------------------------------------------------------------
[SQL]USER>>select ID from ISJ.TestClass1
2.      select ID from ISJ.TestClass1

ID
1
2
3
4
5
6
7
8
9
10

10 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0481s/33891/148856/0ms
          execute time(s)/globals/cmds/disk: 0.0003s/11/887/0ms
                          cached query class: %sqlcq.USER.cls31
---------------------------------------------------------------------------
[SQL]USER>>

 

また、以下実行例のように記述すると、最新 ID の name だけ表示します。

select name from ISJ.TestClass1 WHERE ID=ISJ.getLatestID()
00
1 0 0 18