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