Caché TSQL 構文
一般的に使用される構文
テーブル参照
Caché TSQL は、次の Caché SQL 形式を使用したテーブル参照をサポートしています。
schema.table
必須のテーブル参照コンポーネントは table のみです。
その他の形式の Transact-SQL テーブル参照では、ドットで区切られた最大 4 つのコンポーネントを使用できます。Transact-SQL でのテーブル参照の処理方法を以下に示します。
-
server 接頭語は無視されます (存在する場合)。
-
database 接頭語は削除されます (存在する場合)。Caché では、master という名前のデータベースのみをサポートします。
-
user 接頭語は schema 名にマップされます (存在する場合)。
名前変換のため、トランザクションの実行中はフィールド名からフィールド接尾語がいったん削除され、後で元に戻されます。
一時テーブル
Caché TSQL は #tablename 一時テーブルをサポートしています。#tablename 一時テーブルは現在のプロセスの現在のプロシージャから参照できます。また、現在のプロシージャから呼び出された任意のプロシージャからも参照できます。#tablename 構文は、TSQL プロシージャ (TSQL 言語でプロシージャとして投影されるクラス・メソッド) でのみサポートされます。
一時テーブルは、CREATE TABLE で、"#" で始まるテーブル名を使用して定義します。一時テーブルは実行時に作成されます。プロシージャを終了すると、#tablename テーブル定義は範囲外になります。接続が切断されると、すべての一時テーブルの定義は範囲外になります。DROP TABLE を使用して一時テーブルを明示的に削除することもできます。
ただし、一時テーブルがアクティブな結果セットで参照される場合、その一時テーブルはプロセスから参照できなくなる可能性がありますが、データおよび定義は結果セットが範囲外になるまで保持されます。
#tablename 一時テーブルは、作成プロシージャと、そのプロシージャが呼び出す任意のプロシージャの両方から参照できます。一時テーブルは、入れ子にされたプロシージャの呼び出しで参照できます。呼び出し先のプロシージャで一時テーブルを宣言する必要はありません。呼び出し先のプロシージャでも同じ名前の一時テーブルを作成する場合は、最後に作成されたテーブル定義が使用されます。一時テーブルは Caché ローカル変数を使用して定義されるので、そのテーブルの作成、変更、および削除はジャーナルされるトランザクション・イベントではありません。トランザクションをロールバックしても、これらの操作に影響しません。
トランザクション
BEGIN TRAN、COMMIT、および ROLLBACK のコマンドに対して生成されたコードは明示的なトランザクション・モードを使用しますが、次のトランザクション TSQL では通常、BEGIN TRAN 文の前にアクティブであったモードをリストアします。TSQL では、プロシージャが終了したとき、または COMMIT コマンドまたは ROLLBACK コマンドが発行されたときのモードをリストアします。
カーソル名の管理
実行時に 1 つのバージョンのカーソルのみが開いていれば、同じカーソルを複数回宣言することができます。あるストアド・プロシージャで同じカーソルが複数宣言された場合、最初の宣言以外は、名前変更されたカーソルと関連付けられます。OPEN、FETCH、CLOSE、および DEALLOCATE の文は、該当するカーソルの最後の DECLARE を参照することを前提としています。ストアド・プロシージャに含まれる文の字句の位置は、カーソル名と DECLARE とを対応付けるために使用されます。つまり、そのコードのランタイム・パスは考慮されないので注意してください。
クエリ内のカーソルは、Caché SQL クエリで使用するスキームの拡張子を使用して名前が付けられます。例えば、以下のようになります。
DECLARE C CURSOR FOR SELECT A FROM B
--
OPEN C
FETCH C
CLOSE C
DEALLOCATE C
--
DECLARE C CURSOR FOR SELECT D FROM E
--
OPEN C
FETCH C
CLOSE C
DEALLOCATE C
これは次のように変換されます。
DECLARE C CURSOR FOR SELECT A FROM B
--
OPEN C
FETCH C
CLOSE C
DEALLOCATE C
--
DECLARE Cv2 CURSOR FOR SELECT D FROM E
--
OPEN Cv2
FETCH Cv2
CLOSE Cv2
DEALLOCATE Cv2
システムのストアド・プロシージャ
以下の制限事項付きでサポートされています。
-
引用符なしの名前はサポートされません。例えば EXEC sp_addtype ssn,… は使用できません。EXEC sp_addtype 'ssn',… を使用する必要があります。
-
物理型にスペースを使用できません。
-
物理型は検証でのみ使用できます。
システム・テーブル
システム・テーブルは Caché ネームスペース単位で存在します。
部分的にサポートしています。
SYSOBJECTS 参照
アプリケーションには一般的に、テーブル、ビュー、そのアプリケーション環境で使用するメタデータを作成する設定プロシージャがあります。これらのプロシージャには次のような式があります。
IF EXISTS (SELECT * FROM SYSOBJECTS
WHERE ID = OBJECT_ID('People'))
この例では、これによってテーブルが存在するかどうかが判断されます。通常は DROP および CREATE 文が続き、テーブルのメタデータが再構築されます。
TSQL プロシージャとトリガは、SYSOBJECTS システム・テーブルを参照できます。Caché TSQL は、SYSOBJECTS テーブルの以下の列 (%TSQL.sys.objectsOpens in a new tab クラス・プロパティ) をサポートします。
nameOpens in a new tab | オブジェクト名。 |
idOpens in a new tab | オブジェクト ID。 |
typeOpens in a new tab | オブジェクト型。次の値のいずれかです。K= PRIMARY KEY または UNIQUE 制約、P= ストアド・プロシージャ、RI=FOREIGN KEY 制約、S= システム・テーブル、TR= トリガ、U= ユーザ・テーブル、V= ビュー。 |
deltrigOpens in a new tab | エントリがテーブルの場合は、削除トリガのオブジェクト ID。エントリがトリガの場合は、テーブルのテーブル ID。 |
instrigOpens in a new tab | エントリがテーブルの場合は、挿入トリガのオブジェクト ID。 |
updtrigOpens in a new tab | エントリがテーブルの場合は、更新トリガのオブジェクト ID。 |
parent_objOpens in a new tab | 親オブジェクトのオブジェクト ID 番号。たとえば、トリガまたは制約の場合はテーブル ID。 |
schemaOpens in a new tab | オブジェクトが存在するスキーマの名前。 |
parent_obj_nameOpens in a new tab | parent_obj のオブジェクト名。parent_obj=0 の場合は、parent_obj_name は name と同じです。 |
SYSOBJECTS テーブルは読み取り専用です。SYSOBJECTS テーブルは、TSQL プロシージャまたはトリガ外部から名前 %TSQL_sys.objects で参照できます。SYSOBJECTS は、複数のネームスペースにマップされるテーブルではサポートされていません。
Caché では、クラス・オブジェクトの %Dictionary パッケージで、SYSOBJECTS 参照と同じ操作を実行できることが実証されています。詳細は、"InterSystems Class Reference" の %Dictionary パッケージを参照してください。