SQL PLにおけるSQLパラメータと変数への参照
SQL PLルーチン(SQLファンクション、SQLプロシージャ、高度なトリガを含む)内のSQLパラメータと変数への参照には、特定のルールが適用されます。
一般的に、変数はSQL PLルーチン(SQLファンクション、SQLプロシージャ、および高度なトリガを含む)のSQLステートメントで参照することができます。 しかし、SQL PLルーチンでホスト変数を指定することはできません。 その代わりに、SQL変数、SQLパラメータ、遷移変数、グローバル変数は、SQL文中の式や変数を指定できる場所であればどこでも参照することができます。 より具体的には、SQL変数は、宣言された複合ステートメント内の任意の場所で参照することができ、その複合ステートメント内に直接または間接的に入れ子になっているSQLステートメントも含まれます。 SQL パラメーターは、SQL 関数または SQL プロシージャー本体で参照することができます。 遷移変数はトリガー本体で参照できます。
SQL ステートメントに変数が含まれている場合、特に 2 つ以上の変数の名前が同じ場合や変数と別のオブジェクトの名前が同じ場合は、あいまいさが生じることがあります。 このような状況では、どの変数が参照されたのか、識別子が変数名なのか列などの別のオブジェクトなのかを判別しにくいことがあります。 識別子が変数名の場合、参照が SQL 変数、SQL パラメーター、遷移変数、またはグローバル変数のどれを対象にするものかを判別することが困難になる可能性があります。
SQL 関数内または SQL プロシージャー内の SQL 変数、SQL パラメーター、またはグローバル変数の名前は、その関数またはプロシージャー内で参照される表またはビュー内の列の名前と同じでも構いません。 トリガー内の SQL 変数、遷移変数、またはグローバル変数の名前は、そのトリガー内で参照される表またはビュー内の列の名前と同じでも構いません。 SQL 変数の名前は、同じ関数、プロシージャー、またはトリガー内で宣言されている別の SQL 変数の名前と同じでも構いません。 このことは、2 つの SQL 変数が別々のコンパウンド・ステートメントで宣言される場合に生じる可能性があります。 SQL 変数の宣言を含む compound-statement により、その変数の有効範囲が決まります。 詳細は compound-statementを参照。
SQL変数、SQLパラメータ、グローバル変数という名前が修飾されていない場合、その名前が識別子、SQL変数、SQLパラメータのいずれを指しているかを以下の規則で説明します:
- SET PATH ステートメントまたは SET SCHEMA ステートメントでは、名前は SQL 変数、SQL パラメーター、遷移変数、またはグローバル変数として検査されます。 その名前の SQL 変数、SQL パラメーター、遷移変数、またはグローバル変数が見付からない場合、名前はスキーマ名と見なされます。
- CONNECT、RELEASE、および SET CONNECTION の各ステートメントでは、名前はサーバー名として使用されます。
- CALL ステートメントでは、名前はプロシージャー名として使用されます。
- ASSOCIATE LOCATORS ステートメントまたは DESCRIBE PROCEDURE ステートメントでは、名前はプロシージャー名として使用されます。
同一の名前は明示的に修飾する必要があります。 名前の修飾によって、その名前が列、グローバル変数、SQL 変数、SQL パラメーター、または遷移変数のどれを指すかが明確になります。
- SQL パラメーターは、SQL 関数または SQL プロシージャーの名前で修飾できます。
- SQL 変数は、SQL 変数が宣言されているコンパウンド・ステートメントのラベルで修飾できます。
- 遷移変数は、CREATE TRIGGER ステートメントまたは ALTER TRIGGER ステートメントで指定されている相関名で修飾できます。
- グローバル変数は、そのグローバル変数の作成時に暗黙的または明示的に指定されたスキーマで修飾できます。
名前を修飾しない場合、または修飾されていても未確定な場合は、以下の規則に則って、名前の解決法が決まります。 名前は、以下の順序で一致が検査されて解決されます。
- SQL 関数または SQL プロシージャーで、その関数またはプロシージャーの作成時に表やビューが指定された場合、名前は最初に列として検査されます。
- 名前が列として検出されない場合、名前は SQL 変数、SQL パラメーター、または遷移変数として検査されます。 SQL 変数を宣言できるのは、その参照を含む compound-statement 内、またはそのコンパウンド・ステートメントをネストしているコンパウンド・ステートメント内です。 2 つの SQL 変数、SQL 変数と SQL パラメーター、または SQL 変数と遷移変数の名前が同じである場合、最も内側のコンパウンド・ステートメントで宣言された SQL 変数が使用されます。
- SQL 変数名として検出されない場合、名前は SQL パラメーター名または遷移変数として検査されます。
- SQL パラメーターまたは遷移変数として検出されない場合、名前はグローバル変数として検査されます。
それでも名前が列、SQL 変数、SQL パラメーター、グローバル変数、または遷移変数として解決されず、名前の有効範囲に現行サーバーに存在しない表またはビューが含まれている場合には、その名前は列とみなされます。 現行サーバーに表とビューのすべてが存在する場合には、その名前はグローバル変数であると想定されます。 それ以外の場合、エラーが戻されます。
SQL 関数内、SQL プロシージャー内、またはトリガー内の SQL 変数、SQL パラメーター、遷移変数、またはグローバル変数の名前は、特定の SQL ステートメント内で名前として使用される ID と同じでも構いません。 これらのステートメントでは、SQL 変数、SQL パラメーター、または遷移変数の修飾名はサポートされていません。