SQL パラメーターおよび変数の参照

SQL パラメーターおよび SQL 変数は、式または変数が 指定できる SQL プロシージャー・ステートメント内の任意の場所で 参照することができます。

ホスト変数を、SQL 関数、 SQL プロシージャー、SQL トリガー、または複合 (動的) ステートメント中に指定することはできません。 SQL パラメーターは、ルーチン内の任意の場所で参照でき、そのルーチン名で修飾することができます。 SQL 変数名は、それが宣言された複合ステートメント内の任意の場所で参照することができます。その複合ステートメント内で直接または間接的にネストされたステートメントも同様です。 変数が宣言されている複合ステートメントにラベルが付いていると、変数名の参照をそのラベルで修飾できます。

NOT NULL と明示的に宣言された変数を除き、 SQL パラメーターと SQL 変数はすべてNULL 可能と見なされます。 SQL ルーチン内の SQL パラメーターまたは SQL 変数の名前は、 そのルーチン内で参照される表またはビュー内の列の名前と同じにすることができます。 SQL 変数の名前を、同じルーチンで宣言されている別の SQL 変数名と同じ名前にすることもできます。 このことは、2 つの SQL 変数が別々の複合ステートメント で宣言される場合に生じる可能性があります。 SQL 変数の宣言を含む複合ステートメント は、その変数の有効範囲を決定します。 詳しくは、複合 (compound) ステートメントを参照してください。

同じ名前は、明示的に修飾する必要があります。名前の修飾によって、名前が列、グローバル変数、SQL 変数、または SQL パラメーターのどれを指しているのかが明確に示されます。名前を修飾しない場合、または修飾されていても未確定な場合は、以下の規則に則って、名前の解決法が決まります。名前は、以下の順序で一致が検査されて解決されます。

  • SQL ルーチン本体内に指定されている表またはビューが、ルーチンの作成時に存在している場合、 その名前は最初に列名としてチェックされます。
  • 列として見つからなければ、その名前は SQL 変数名としてチェックされます。この SQL 変数を宣言できるのは、その参照を含む compound-statement 内、またはその複合ステートメントをネストしている複合ステートメント内です。同一の有効範囲内に 2 つの SQL 変数があって、同一の名前を持つ場合、1 最も内側の複合ステートメントで宣言された SQL 変数が使用されます。
  • SQL 変数名として見つからなければ、その名前は SQL パラメーター名としてチェックされます。

その名前が依然として列、SQL 変数、または SQL パラメーターとして解決できず、名前の有効範囲に現行サーバーには存在しない表またはビューが含まれている場合には、その名前は列またはグローバル変数であると想定されます。現行サーバーに表とビューのすべてが存在する場合には、その名前はグローバル変数であると想定されます。SQL_GVAR_BUILD_RULE QAQQINI オプション が *EXIST であり、そのグローバル変数が存在しない場合、エラーが発行されます。

SQL ルーチン中の SQL 変数または SQL パラメーターの名前を、 特定の SQL ステートメント中で使用されている ID 名と同じ名前にすることもできます。 その名前を修飾しない場合、次の規則によって、その名前が ID を参 照するのか、SQL パラメーターまたは SQL 変数を参照するのか が記述されます。修飾された SQL パラメーターおよび SQL 変数 をこれらの名前に使用することはサポートされていません。

  • SET PATH ステートメントおよび SET SCHEMA ステートメントでは、その 名前は SQL パラメーター名または SQL 変数名としてチェックされます。 SQL 変数名または SQL パラメーター名として見つからなければ、そ の名前は ID として使用されます。
  • CONNECT、DISCONNECT、RELEASE、および SET CONNECTION ステートメント内では、その名前は ID として使用されます。
  • CALL ステートメント内では、その名前は ID として使用されます。
  • ASSOCIATE LOCATORS および DESCRIBE PROCEDURE ステートメント内では、 CREATE TRIGGER ステートメントで使用される場合は、その名前は ID として使用されます。
1 これは、これらの変数が別々の複合ステートメント内で宣言されている場合に生じる可能性があります。