Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

TSQL 変数

ローカル変数

既定では、TSQL ローカル変数は接頭辞にアット・マーク (@) を使用して指定します。例えば、@myvar のようにします。この既定は、PLAINLOCALS も許容するようにオーバーライドできます。これにより、接頭辞のアット・マーク (@) なしで指定した TSQL ローカル変数を使用できます。例えば、myvar のようにします。

ローカル変数の宣言

ローカル変数は、使用前に (DECLARE を使用するかまたは仮パラメータとして) 宣言する必要があります。変数名は、有効な識別子である必要があります。ローカル変数名は、大文字と小文字が区別されません。InterSystems TSQL では厳密なデータ型の指定は必須ではありませんが、宣言では何らかのデータ型を指定する必要があります。サポートされているデータ型のリストは、このドキュメントの “TSQL 構文” の章を参照してください。

DECLARE コマンドの構文は以下のとおりです。

DECLARE @var [AS] datatype [ = initval]

宣言している変数が不適切な場合は、NDC 設定を使用して、このチェックをオフに切り替えることができます。ただし、NDC を使用する場合でもカーソルを宣言する必要があります。

ストアド・プロシージャの引数は、自動的にローカル変数として宣言されます。

ローカル変数の設定

ローカル変数は、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()

初期値および既定値

既定では、DECLARE はローカル変数を "" (SQL NULL) に初期化します。必要な場合は、DECLARE コマンドに、ローカル変数の初期値 (initval) を指定できます。

宣言された変数がスカラのサブクエリの結果に設定される場合、サブクエリが行を返さないと、InterSystems TSQL はその変数を "" (SQL NULL) に設定します。この既定は、MS SQLServer と互換性がありますが、Sybase とは互換性がありません。

プレーンなローカル変数

既定では、ローカル変数には接頭辞 @ が必要です。しかし、プレーンなローカル変数 (接頭辞 @ を必要としないローカル変数) も指定できます。以下のコマンドは、プレーンなローカル変数を有効化します。

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

直前の SELECTINSERTUPDATE、または 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

FeedbackOpens in a new tab