Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

TSQL 変数

ローカル変数

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

ローカル変数の宣言

ローカル変数は、使用前に (DECLARE を使用するかまたは仮パラメータとして) 宣言する必要があります。変数名は、有効な識別子である必要があります。ローカル変数名は、大文字と小文字が区別されません。Caché 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) を指定できます。

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

プレーンなローカル変数

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

SET PLAINLOCALS ON

プレーンなローカル変数は、宣言する前に有効化する必要があります。有効化されたプレーンなローカル変数で、接頭辞 @ のあるローカル変数も、接頭辞 @ のないローカル変数も宣言できます。ただし、接頭辞 @ のみが異なる 2 つの変数は宣言できません。例えば、@myvar と myvar は同じ変数と見なされます。プレーンなローカル変数を宣言、選択、または出力するときには、同じ変数で接頭辞 @ のあるもの、またはないものを指定できます。

プレーンなローカル変数は、その他すべての TSQL 変数規約に従います。

@@ 特殊変数

TSQL 特殊変数は、接頭辞 @@ で識別されます。@@ 変数はシステム側で定義されています。ユーザ・プロセスでは作成も変更もできません。スコープでは、@@ 変数はグローバルなので、すべてのプロセスで利用できます。そのため、他の Transact-SQL のドキュメントでは “グローバル変数” と呼ばれることもあります。Caché では “グローバル変数” という用語をまったく別の意味で広く使用しているので、混乱を避ける意味で、これらの TSQL @@ 変数をここでは “特殊変数” と呼ぶことにします。

実装されている特殊変数は以下のとおりです。未実装の特殊変数を呼び出すと、#5001 '@@nnn' unresolved symbol エラーまたは #5002 <UNDEFINED> エラーが生成されます。各特殊変数に対し、対応する ObjectScript (COS) および Caché SQL で生成したコードが提供されます。

@@ERROR

最新の TSQL エラーのエラー番号が含まれます。0 はエラーが発生していないことを示します。値 0 が返されるのは、SQLCODE=0 (正常に終了) の場合、または SQLCODE=100 (値が存在しない、または値がこれ以上存在しない) の場合です。これらの 2 つの結果を区別するには、@@SQLSTATUS を使用します。

COS 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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_FETCH_STATUS()

COS $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 フィールドの値が含まれます。

COS %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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_LOCK_TIMEOUT()

COS 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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_NESTLEVEL()

COS $STACK

@@ROWCOUNT

直前の SELECTINSERTUPDATE、または DELETE コマンドの影響を受ける行数が含まれます。単一行の SELECT は、常に 0 (行が選択されていない) または 1 のいずれかの @@ROWCOUNT 値を返します。

AFTER 文レベルのトリガを起動する場合、トリガ入力時の @@ROWCOUNT の値は、トリガの直前の @@ROWCOUNT です。トリガ・コードのスコープ内で影響を受けた行は、@@ROWCOUNT 値に反映されます。トリガ・コードの完了時、@@ROWCOUNT はトリガ呼び出しの直前の値に戻されます。

COS %ROWCOUNT

SQL :%ROWCOUNT

@@SERVERNAME

Caché インスタンス名が含まれます。

  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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_SERVERNAME()

COS $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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_SPID()

COS $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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_SQLSTATUS()

COS $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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_TRANCOUNT()

COS $TLEVEL

@@VERSION

Caché バージョン番号およびインストールした日付と時刻が含まれます。

  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()

対応する Caché SQL 関数は以下のとおりです。

SELECT $TSQL_VERSION()

COS $ZVERSION

FeedbackOpens in a new tab