Skip to main content

#sqlcompile path

これ以降に記述されている埋め込み SQL DML 文のスキーマ検索パスを指定します。

説明

このマクロ・プリプロセッサ指示文は、これ以降に記述されている埋め込み SQL DML 文のスキーマ検索パスを指定します。以下の形式をとります。

#sqlcompile path=schema1[,schema2[,...]]

schema は、現在のネームスペースで未修飾の SQL テーブル名、ビュー名、またはプロシージャ名を検索する際に使用するスキーマ名です。単一のスキーマ名を指定できるほか、複数のスキーマ名をコンマ区切りリストで指定することもできます。複数のスキーマは指定の順序で検索されます。最初の一致が出現すると、検索は終了し、DML 操作が実行されます。いずれのスキーマにも一致が含まれていない場合、システム全体の既定のスキーマが検索されます。

スキーマは指定された順序で検索されるため、あいまいなテーブル名は検出されません。#import プリプロセッサ指示文も、スキーマ名のリストから未修飾の SQL テーブル名、ビュー名、プロシージャ名にスキーマ名を指定します。#import はあいまいな名前を検出します。

InterSystems IRIS は、#sqlcompile path 指示文に存在しないスキーマ名を無視します。InterSystems IRIS は、#sqlcompile path 指示文の重複したスキーマ名を無視します。

  • #sqlcompile path は SQL DML 文に適用されます。これを使用して、SQL SELECT クエリの未修飾テーブル名とビュー名、および INSERTUPDATE、および DELETE 演算の未修飾テーブル名とビュー名を解決できます。#sqlcompile path を使用すると、SQL の CALL 文にある未修飾プロシージャ名を解決することもできます。

  • #sqlcompile path は SQL DDL 文には適用されません。これは、CREATE TABLE やその他の CREATE 文、ALTER 文、DROP 文などのデータ定義文内の未修飾のテーブル名、ビュー名、およびプロシージャ名の解決には使用できません。この項目の定義を作成、変更、または削除する場合に、テーブル、ビュー、またはストアド・プロシージャに未修飾名を指定すると、InterSystems IRIS では #sqlcompile path の値が無視され、システム全体の既定のスキーマが使用されます。

ダイナミック SQL では、%SchemaPath プロパティを使用して、未修飾名を解決するためのスキーマ検索パスを指定します。

以下の例では、未修飾テーブル名 Person を Sample.Person テーブルに解決します。最初に Cinema スキーマ を検索しますが、これには Person というテーブルが含まれていないので、続いて Sample スキーマを検索します。

#sqlcompile path=Cinema,Sample
  &sql(SELECT Name,Age
       INTO :a,:b
       FROM Person)
  WRITE "Name is: ",a,!
  WRITE "Age is: ",b

検索パスの項目としてスキーマ名を指定した上で、以下のキーワードを指定できます。

  • CURRENT_PATH : 前の #sqlcompile path プリプロセッサ指示文で定義されている現在のスキーマ検索パスを指定します。これは、以下の例のように、既存のスキーマ検索パスの先頭や末尾にスキーマを付加するときに広く使用します。

    #sqlcompile path=schema_A,schema_B,schema_C
    #sqlcompile path=CURRENT_PATH,schema_D
  • CURRENT_SCHEMA : 現在のスキーマのコンテナのクラス名を指定します。クラス・メソッドで #sqlcompile path を定義している場合、CURRENT_SCHEMA は現在のクラス・パッケージにマップされたスキーマになります。.MAC ルーチンで #sqlcompile path を定義している場合、CURRENT_SCHEMA は構成の既定のスキーマになります。

    例えば、#sqlcompile path=CURRENT_SCHEMA を指定するクラス・メソッドをクラス User.MyClass で定義している場合、User パッケージの既定のスキーマ名は SQLUser なので、CURRENT_SCHEMA は既定で SQLUser に解決されます。これは、さまざまなパッケージにスーパークラスおよびサブクラスがあり、未修飾テーブル名を使用する SQL クエリを持つスーパークラスでメソッドを定義する場合に便利です。CURRENT_SCHEMA を使用して、テーブル名をスーパークラスのスーパークラス・スキーマおよびサブクラスのサブクラス・スキーマに解決できます。CURRENT_SCHEMA の検索パスを設定していない場合、テーブル名は両方のクラスのスーパークラス・スキーマに解決されます。

    トリガに #sqlcompile path=CURRENT_SCHEMA を使用している場合は、スキーマ・コンテナ・クラス名が使用されます。例えば、クラス pkg1.myclass#sqlcompile path=CURRENT_SCHEMA を指定するトリガがあり、クラス pkg2.myclasspkg1.myclass の拡張である場合、pkg2.myclass クラスをコンパイルするときに、このトリガの SQL 文に記述された非修飾テーブル名はパッケージ pkg2 のスキーマに解決されます。

  • DEFAULT_SCHEMA は、システム全体の既定のスキーマを指定します。このキーワードを使用すると、リストされている他のスキーマを検索する前に、スキーマ検索パス内の項目としてシステム全体の既定のスキーマを検索できます。パスに指定されているすべてのスキーマを検索して一致が見つからなかった場合、システム全体の既定のスキーマは常に、スキーマ検索パスの検索後に検索されます。

スキーマ検索パスを指定している場合、SQL クエリ・プロセッサで未修飾の名前を解決するとき、その指定のスキーマ検索パスが最初に使用されます。指定されたテーブルまたはプロシージャが見つからない場合、SQL クエリ・プロセッサは #import (指定されている場合) で指定されているスキーマ、または構成されているシステム全体の既定のスキーマを検索します。指定されたテーブルがこれらの場所のどこにも見つからない場合は、SQLCODE -30 エラーが生成されます。

スキーマ検索パスのスコープは、それが定義されているルーチンまたはメソッドです。クラス・メソッドでスキーマ・パスを指定している場合、これはそのクラス・メソッドのみに適用され、同じクラスにある他のメソッドには適用されません。.MAC ルーチンで指定したスキーマ検索パスの場合は、その指定した位置から別の #sqlcompile path 指示文が現れるまで、またはルーチンの最後に達するまでがスコープとなります。

スキーマは現在のネームスペースに対して定義されます。

#import プリプロセッサ指示文と比較します。

FeedbackOpens in a new tab