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
直前の SELECT、INSERT、UPDATE、または 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