ローカル変数の設定
ローカル変数は、SET コマンドまたは SELECT コマンドのどちらでも設定できます。ローカル変数は、PRINT コマンドまたは SELECT コマンドのどちらを使用しても表示できます。以下のダイナミック SQL の例は、宣言、設定、および表示される 2 つのローカル変数を示しています。
SET myquery = 3
SET myquery(1) = "DECLARE @a CHAR(20),@b CHAR(20) "
SET myquery(2) = "SET @a='hello ' SET @b='world!' "
SET myquery(3) = "PRINT @a,@b"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
SET myquery = 3
SET myquery(1) = "DECLARE @a CHAR(20),@b CHAR(20) "
SET myquery(2) = "SELECT @a='hello ', @b='world!'"
SET myquery(3) = "SELECT @a,@b"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
プレーンなローカル変数
既定では、ローカル変数には接頭辞 @ が必要です。しかし、プレーンなローカル変数 (接頭辞 @ を必要としないローカル変数) も指定できます。以下のコマンドは、プレーンなローカル変数を有効化します。
SET PLAINLOCALS ON
プレーンなローカル変数は、宣言する前に有効化する必要があります。有効化されたプレーンなローカル変数で、接頭辞 @ のあるローカル変数も、接頭辞 @ のないローカル変数も宣言できます。ただし、接頭辞 @ のみが異なる 2 つの変数は宣言できません。例えば、@myvar と myvar は同じ変数と見なされます。プレーンなローカル変数を宣言、選択、または出力するときには、同じ変数で接頭辞 @ のあるもの、またはないものを指定できます。
プレーンなローカル変数は、その他すべての TSQL 変数規約に従います。
以下の TSQL クラス・メソッドは PLAINLOCALS ON を指定し、@ ローカル変数とプレーンなローカル変数の両方を宣言して使用します。
ClassMethod Hello() As %String [Language=tsql,ReturnResultsets,SqlProc ]
{ SET PLAINLOCALS ON;
DECLARE @a CHAR(20),b CHAR(20);
SET @a='hello ' SET b='world!';
PRINT @a,b;
}
@@ 特殊変数
TSQL 特殊変数は、接頭辞 @@ で識別されます。@@ 変数はシステム側で定義されています。ユーザ・プロセスでは作成も変更もできません。スコープでは、@@ 変数はグローバルなので、すべてのプロセスで利用できます。そのため、他の Transact-SQL のドキュメントでは “グローバル変数” と呼ばれることもあります。InterSystems IRIS では “グローバル変数” という用語をまったく別の意味で広く使用しているので、混乱を避ける意味で、これらの TSQL @@ 変数をここでは “特殊変数” と呼ぶことにします。
実装されている特殊変数は以下のとおりです。未実装の特殊変数を呼び出すと、#5001 '@@nnn' unresolved symbol エラーまたは #5002 <UNDEFINED> エラーが生成されます。各特殊変数に対し、対応する ObjectScript および InterSystems SQL で生成したコードが提供されます。
@@ERROR
最新の TSQL エラーのエラー番号が含まれます。0 はエラーが発生していないことを示します。値 0 が返されるのは、SQLCODE=0 (正常に終了) の場合、または SQLCODE=100 (値が存在しない、または値がこれ以上存在しない) の場合です。これらの 2 つの結果を区別するには、@@SQLSTATUS を使用します。
ObjectScript SQLCODE
SQL :SQLCODE
@@FETCH_STATUS
直前の FETCH カーソル文のステータスを指定する整数が含まれます。使用可能なオプションは以下のとおりです。0 = 行が正常にフェッチされた。-1 = データをフェッチできなかった。-2 = フェッチする行が存在しなかったか、何らかのエラーが発生した。-1 の値は、FETCH するデータがない、または FETCH コマンドがデータの最後に達したことを示します。
SET myquery = "SELECT @@FETCH_STATUS AS FetchStat"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_FETCH_STATUS()
ObjectScript $Case($Get(SQLCODE,0),0:0,100:-1,:-2)
SQL CASE :SQLCODE WHEN 0 THEN 0 WHEN 100 THEN –1 ELSE –2 END
@@IDENTITY
最後に挿入、更新または削除された行の IDENTITY フィールドの値が含まれます。
ObjectScript %ROWID
SQL :%ROWID
@@LOCK_TIMEOUT
ロックのタイムアウト値を秒単位で指定する整数が含まれます。ロック・タイムアウトは、リソースでの挿入、更新、削除、および選択に排他的にロックをかける必要がある際に使用します。既定値は 10 です。
SET myquery = "SELECT @@LOCK_TIMEOUT AS LockTime"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_LOCK_TIMEOUT()
ObjectScript LOCK コマンド
SQL SET OPTION LOCK_TIMEOUT
@@NESTLEVEL
現在のプロセスの入れ子レベルを指定する整数が含まれます。
SET myquery = "PRINT @@NESTLEVEL"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_NESTLEVEL()
ObjectScript $STACK
@@ROWCOUNT
直前の SELECT、INSERT、UPDATE、または DELETE コマンドの影響を受ける行数が含まれます。単一行の SELECT は、常に 0 (行が選択されていない) または 1 のいずれかの @@ROWCOUNT 値を返します。
AFTER 文レベルのトリガを起動する場合、トリガ入力時の @@ROWCOUNT の値は、トリガの直前の @@ROWCOUNT です。トリガ・コードのスコープ内で影響を受けた行は、@@ROWCOUNT 値に反映されます。トリガ・コードの完了時、@@ROWCOUNT はトリガ呼び出しの直前の値に戻されます。
ObjectScript %ROWCOUNT
SQL :%ROWCOUNT
@@SERVERNAME
InterSystems IRIS インスタンス名が含まれます。
SET myquery = "SELECT @@SERVERNAME AS CacheInstance"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_SERVERNAME()
ObjectScript $PIECE($system,":",2)
@@SPID
現在のプロセスのサーバ・プロセス ID が含まれます。
SET myquery = "SELECT @@SPID AS ProcessID"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_SPID()
ObjectScript $JOB
@@SQLSTATUS
直前の SQL 文の完了ステータスを指定する整数が含まれます。0 = 成功、1 = 失敗、2 = 有効な値がまったく (またはそれ以上) ない、のいずれかの値を取ることができます。
SET myquery = "SELECT @@SQLSTATUS AS SQLStatus"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_SQLSTATUS()
ObjectScript $Case($Get(SQLCODE,0),0:0,100:2,:1)
SQL CASE :SQLCODE WHEN 0 THEN 0 WHEN 100 THEN 2 ELSE 1 END
@@TRANCOUNT
現在アクティブなトランザクションの数が含まれます。
SET myquery = "SELECT @@TRANCOUNT AS ActiveTransactions"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_TRANCOUNT()
ObjectScript $TLEVEL
@@VERSION
InterSystems IRIS バージョン番号およびインストールした日付と時刻が含まれます。
SET myquery = "SELECT @@VERSION AS CacheVersion"
SET tStatement = ##class(%SQL.Statement).%New(,,"MSSQL")
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 { WRITE "%Prepare failed",$System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
対応する InterSystems SQL 関数は以下のとおりです。
SELECT $TSQL_VERSION()
ObjectScript $ZVERSION