関数解決

関数はその関数名によって呼び出されます。関数名は、暗黙的にまたは明示 的にスキーマ名で修飾され、その後に括弧で囲まれた関数への引数が 続きます。

データベース内では、それぞれの関数はその関数のシグニチャー によって一意的に識別されます。シグニチャーとは、そのスキーマ名、関数名、パラメーター数、およびパラメーターのデータ・タイプのことです 。このため、スキーマでは、関数名が同じでも、それぞれパラメーター 数が異なるか、パラメーター・データ・タイプが異なるため、複数の関数を 持つことができます。あるいは、名前やパラメーター数、パラメーターのタ イプが同じ関数でも、別々のスキーマには存在することができます。 関数が呼び出されると、データベース・マネージャーは実行すべき関数を決定することが必要になります。 このプロセスを、関数解決 と呼びます。

一群の候補関数の判別:

  • 関数呼び出しの引数の数を A とします。
  • 関数シグニチャー中のパラメーターの数を P とします。
  • 関数シグニチャーでデフォルトが定義されていないパラメーターの数を N とします。

関数呼び出しを解決するための候補関数は、以下の基準で選択されます。

  • 各候補関数は、一致する名前と適用可能なパラメーター数を持つ。 適用可能なパラメーター数とは、N ≤ A ≤ P という条件を満たすパラメーター数のことです。
  • 候補関数のパラメーターのうち、対応引数が関数呼び出しで位置でも名前でも指定されていない各パラメーターは、デフォルトを使用して定義される。
  • 1 つ以上のスキーマの集合に含まれる各候補関数は、関数を呼び出しているステートメントの許可 ID に関連付けられた EXECUTE 特権を持つ。

関数解決は、関数を修飾関数名を指定して呼び出した場合と非修飾関数名を指定して 呼び出した場合で同じです。ただし、非修飾名を指定した場合、データベース・マネージャーは複数の スキーマを検索する必要があります。

  • 修飾関数解決: 関数が関数名とスキーマ名を使用して呼び出されると、 データベース・マネージャーは指定されたスキーマのみを検索して候補関数を 探します。

    スキーマ内で候補関数が見つからない場合、 エラーが戻されます。関数が選択された場合、関数が正常に実行されるかどうかは、 その関数が呼び出されたコンテキストで、戻される結果が有効であるかどうかによって左右されます。 例えば、関数が文字データ・タイプでなければならないところに整数データ・タイプを戻したり、 表が許可されていないのに表を戻したりすると、エラーが返されます。

  • 修飾されない関数解決: 関数が関数名だけで呼び 出されると、データベース・マネージャーは実行する関数インスタンスを決めるために、複数のスキーマ を検索する必要があります。SQL パスは、検索するスキーマのリストを持っています。 SQL パス (SQL パスを参照) 内の各スキーマごとに、データベース・マネージャーは候補となる関数を選択します。

    パス内のどのスキーマ内にも候補関数がない場合、 エラーが戻されます。関数が選択された場合、関数が正常に実行されるかどうかは、 その関数が呼び出されたコンテキストで、戻される結果が有効であるかどうかによって左右されます。 例えば、関数が文字データ・タイプでなければならないところに整数データ・タイプを戻したり、 表が許可されていないのに表を戻したりすると、エラーが返されます。

データベース・マネージャーは、候補の関数を識別した後で、実行する関数インスタンスとして最適のものを 選択します (最適の判別を参照してください)。最適 (関数シグニチャーがスキーマ名を除いて同一) の関数インスタン スが、複数のスキーマにある場合は、データベース・マネージャーは SQL パスで一番早い スキーマの関数を選択します。

関数解決は、組み込み関数を含むすべての関数に適用されます。組み込み関数は、スキーマ QSYS2 に論理的に存在します。スキーマ QSYS2 が SQL パスで明示的に指定されていない場合は、スキーマは暗黙 的にそのパスの前にあるものと見なされます。非修飾関数名を指定する場合は、対象の関数が選択されるようにするために、各スキーマを正しい検索順序で並べたリストを SQL パスとして設定しなければなりません。

CREATE VIEW または CREATE TABLE ステートメント では、ビューまたはマテリアライズ照会表の作成時に関数解決 が実行されます。その後で同じ名前の他の関数が作成された場合でも、そのビューまたはマテリアライズ照会表は影響を受けません。そのビューまたはマテリアライズ表の作成時に選択された関数よりもその新しい関数のほうが適しているとしても、その動作に変わりはありません。CREATE FUNCTION、 CREATE PROCEDURE、CREATE TRIGGER、CREATE VARIABLE、CREATE MASK、 または CREATE PERMISSION ステートメントでは、関数、プロシージャー、 トリガー、変数、マスク、または許可が作成されるときに、関数解決が 実行されます。選択された関数のスキーマが、トリガー、変数、マスク、および許可 で保存されます。また、デフォルト式の関数およびプロシージャーでも 保存されます。後で同じ名前の別の関数が作成された場合、 関数、プロシージャー、トリガー、変数、マスク、許可、またはルーチン・デフォルト に影響が及ぶのは、オブジェクトが作成された時点で選択された関数よりも新しい関数 のほうがより適している場合のみです。