最適の判別

実行の候補となるような同じ名前の関数が、複数存在する場合があります。その場合、候補関数のセットに含まれる各関数のパラメーターのデータ・タイプ、SQL パスでのスキーマの位置、パラメーターの総数を使用して、関数が最適要件を満たすかどうかが判別されます。 関数の結果のデータ・タイプ、 または現在考慮中の関数のタイプ (集約、スカラー、または表) もこの決定では考慮されないことに注意してください。

変更の始まり

候補関数のセットに複数の関数が含まれており、関数呼び出しで名前付き引数が使用されている場合、名前付き引数に対応するパラメーターの順序位置は、すべての候補関数で同じでなければなりません。

パラメーター・セット という用語は、候補関数のセットの (上記のようなパラメーターが存在する) パラメーター・リストで同じ位置にあるすべてのパラメーターを表します。 パラメーターの対応引数は、関数呼び出しで引数がどのように指定されているかに基づいて判別されます。 定位置引数の場合、パラメーターの対応引数は、関数呼び出しにおいて候補関数のパラメーター・リストでのパラメーターと同じ位置にある引数です。 名前付き引数の場合、パラメーターの対応引数は、パラメーターと同じ名前の引数です。 この場合、関数呼び出しにおける引数の順序は、最適を判別する際に考慮されません。 候補関数のパラメーター数が関数呼び出しでの引数の数よりも多い場合、対応引数のない各パラメーターは、あたかも DEFAULT キーワードを値として持つ対応引数があるかのように処理されます。

変更の終わり

変更の始まり 最適である関数を判別するために、以下のステップが使用されます。 変更の終わり

変更の始まり 変更の終わり
変更の始まり

関数解決のための暗黙的キャスト

ユーザー定義タイプまたは XML、 ROWID、または DATALINK データ・タイプを持つ引数については、関数解決の暗黙的キャストはサポートされません。 組み込み関数またはユーザー定義 cast 関数の場合にもサポートされません。サポートされるのは、以下の場合です。
  • DATE、TIME、および TIMESTAMP 以外の組み込みタイプから数値データ・タイプへのサポートされる任意のキャスト。表 2を参照してください。
  • 型なし引数をどのデータ・タイプにもキャストできる。
プロモーション用のデータ・タイプ優先順位リストと同様に、暗黙的キャストの場合も関連したデータ・タイプのグループ内のデータ・タイプに対する順序があります。 この順序は、暗黙的キャストを考慮する関数解決の実行時に使用されます。 表 1 は、関数解決のための暗黙的キャストに使用するデータ・タイプの順序を示しています。 データ・タイプは優先順位の高いものから順にリストされます (これは、プロモーション用のデータ・タイプ優先順位リストの順序とは異なることに注意してください)。
表 1. 関数解決のための暗黙的キャストに使用するデータ・タイプの順序
データ・タイプ・グループ 関数解決のための暗黙的キャストに使用するデータ・タイプ・リスト (優先順位の高いものから順に)
数値データ・タイプ DECFLOAT、 double、 real、 decimal、 BIGINT、 INTEGER、 SMALLINT
文字データ・タイプおよび GRAPHIC ストリング・データ・タイプ VARCHAR または VARGRAPHIC、CHAR または GRAPHIC、CLOB または DBCLOB
バイナリー・データ・タイプ VARBINARY、BINARY、BLOB、VARCHAR FOR BIT DATA、 CHAR FOR BIT DATA
日時データ・タイプ TIMESTAMP、DATE、TIME
注:
小文字で示したタイプの定義は、以下のとおりです。
10 進数
= DECIMAL(p,s) または NUMERIC(p,s)
real
= REAL または FLOAT(n)。この場合の n は短精度浮動小数点数の指定
double
= DOUBLE、DOUBLE PRECISION、FLOAT または FLOAT(n)。 この場合の n は倍精度浮動小数点数の指定
変更の終わり
変更の始まり

以下に、関数解決の例を示します。 (必要なキーワードがすべて示されているわけではないことに注意してください。)

変更の終わり
変更の始まり

例 1: 以下に、関数解決での SQL パスの考慮事項を示す例があります。 この例では、3 つの異なるスキーマに 8 つの ACT 関数があり、以下のように登録されています。

CREATE FUNCTION AUGUSTUS.ACT (CHAR(5), INT, DOUBLE) SPECIFIC ACT_1 ...
CREATE FUNCTION AUGUSTUS.ACT (INT, INT, DOUBLE) SPECIFIC ACT_2 ...
CREATE FUNCTION AUGUSTUS.ACT (INT, INT, DOUBLE, INT) SPECIFIC ACT_3 ...
CREATE FUNCTION JULIUS.ACT (INT, DOUBLE, DOUBLE) SPECIFIC ACT_4 ...
CREATE FUNCTION JULIUS.ACT (INT, INT, DOUBLE) SPECIFIC ACT_5 ...
CREATE FUNCTION JULIUS.ACT (SMALLINT, INT, DOUBLE) SPECIFIC ACT_6 ...
CREATE FUNCTION JULIUS.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_7 ...
CREATE FUNCTION NERO.ACT (INT, INT, DEC(7,2)) SPECIFIC ACT_8 ...      

以下のように関数が参照されるとします (I1 および I2 は INTEGER 列、 D は DECIMAL 列です)。

SELECT ... ACT(I1, I2, D) ...

この参照を行うアプリケーションの SQL パスが次のようになっているとします。

"JULIUS","AUGUSTUS","CAESAR"
関数解決の規則は次のとおりです。
  • スキーマ NERO が SQL パスに組み込まれていないため、特定の名前 ACT_8 の付いた関数は候補から除かれます。
  • パラメーターの数が違っているため、ACT_3 は候補から除かれます。 第 1 引数が第 1 パラメーターのデータ・タイプにプロモートできないため、 ACT_1 と ACT_6 はどちらも候補から除かれます。
  • この時点で複数の候補が残っているため、次に引数が順に検討されます。
    • 最初の引数については、残りのすべての関数 ACT_2、ACT_4、ACT_5、および ACT_7 がその引数タイプと完全に一致します。 この検討ではどの関数も検討の対象から除かれないため、 次の引数を検討する必要があります。
    • 2 番目の引数では、ACT_2、ACT_5、および ACT_7 が完全に一致していますが、 ACT_4 は一致していないため、ACT_4 が検討の対象から除かれます。 ACT_2、ACT_5、および ACT_7 の間の何らかの差異を判別するために、さらに次の引数が検討されます。
    • 第 3 の最後の引数では、ACT_2、ACT_5、ACT_7 のいずれも、引数のタイプと完全には一致していません。 ACT_2 と ACT_5 の適合度は同程度ですが、ACT_7 は他の 2 つよりも適合度が劣ります。タイプ DOUBLE は DECFLOAT よりも、DECIMAL に近いからです。 ACT_7 は除去されます。
  • この時点で、 パラメーター・シグニチャーが同じである関数として ACT_2 と ACT_5 の 2 つが残っています。 最終的な決定要因は、どちらの関数のスキーマが SQL パスで先に出現するかであり、 この基準によって ACT_5 が最終的に選択されます。
変更の終わり
変更の始まり

例 2: これは、関数解決がエラーになるというシチュエーションの例です。 エラーになる原因は、同程度に呼び出しに適合する候補関数が複数あるが、 引数の 1 つの対応パラメーターが同じタイプ優先順位リストに属していない ことです。

この例では、以下のように定義された単一のスキーマに 3 つの関数のみ含まれています。

CREATE FUNCTION CAESAR.ACT (INT, VARCHAR(5), VARCHAR(5)) SPECIFIC ACT_1 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DATE) SPECIFIC ACT_2 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...   

以下のように関数が参照されるとします (I1 および I2 は INTEGER 列、VC は VARCHAR 列です)。

SELECT ... ACT(I1, I2, VC) ...

この参照を行うアプリケーションの SQL パスが次のようになっているとします。

"CAESAR"
関数解決の規則は次のとおりです。
  • 関数呼び出しの各入力引数のデータ・タイプが、関数インスタンスの対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモート可能かどうかを判別するために、それぞれの候補関数が評価されます。
    • 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
    • 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。
    • 3 番目の引数については、VARCHAR を DATE または DOUBLE にプロモートできないため、候補関数が残らないように、ACT_2 と ACT_3 の両方が除去されます。
  • 上からの候補関数のサブセットが空のため、候補関数はキャスト可能なプロセスを使用して考慮されます。
    • 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
    • 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。 ACT_2 と ACT_3 が候補として適しています。
    • 3 番目の引数については、ACT_2 および ACT_3 の対応するパラメーターのデータ・タイプが同じデータ・タイプの優先順位リストに属していないため、エラーが戻されます。
変更の終わり
変更の始まり

例 3: この例では、キャスト可能なプロセスを使用して関数解決が成功する状況を示しています。

この例では、以下のように定義された単一のスキーマに 3 つの関数のみ含まれています。

CREATE FUNCTION CAESAR.ACT (INT, VARCHAR(5), VARCHAR(5)) SPECIFIC ACT_1 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_2 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...   

以下のように関数が参照されるとします (I1 および I2 は INTEGER 列、VC は VARCHAR 列です)。

SELECT ... ACT(I1, I2, VC) ...

この参照を行うアプリケーションの SQL パスが次のようになっているとします。

"CAESAR"
関数解決の規則は次のとおりです。
  • 関数呼び出しの各入力引数のデータ・タイプが、関数インスタンスの対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモート可能かどうかを判別するために、それぞれの候補関数が評価されます。
    • 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
    • 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。
    • 3 番目の引数については、VARCHAR を DECFLOAT または DOUBLE にプロモートできないため、候補関数が残らないように、ACT_2 と ACT_3 の両方が除去されます。
  • 上からの候補関数のサブセットが空のため、候補関数はキャスト可能なプロセスを使用して考慮されます。
    • 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
    • 2 番目の引数については、INTEGER を VARCHAR にプロモートできないため、ACT_1 は除去されます。 ACT_2 と ACT_3 が候補として適しています。
    • 3 番目の引数については、DECFLOAT と DOUBLE の両方が同じデータ・タイプの優先順位リストにあり、VARCHAR は DECFLOAT と DOUBLE の両方を暗黙のうちにキャストできます。DECFLOAT は暗黙的キャストに適しているため、 ACT_2 が最適です。
変更の終わり
変更の始まり

例 4: この例では、キャスト可能なプロセスを使用した関数解決時に、後の引数のプロモーションが暗黙的キャストより優先することを示しています。

この例では、以下のように定義された単一のスキーマに 3 つの関数のみ含まれています。

CREATE FUNCTION CAESAR.ACT (INT, INT, VARCHAR(5)) SPECIFIC ACT_1 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DECFLOAT) SPECIFIC ACT_2 ...
CREATE FUNCTION CAESAR.ACT (INT, INT, DOUBLE) SPECIFIC ACT_3 ...   

以下のように関数が参照されるとします (I1 は INTEGER 列、VC1 は VARCHAR 列、および C1 は CHAR 列です)。

SELECT ... ACT(I1, VC1, C1) ...

この参照を行うアプリケーションの SQL パスが次のようになっているとします。

"CAESAR"
関数解決の規則は次のとおりです。
  • 関数呼び出しの各入力引数のデータ・タイプが、関数インスタンスの対応するパラメーターのデータ・タイプと一致するか、またはそのデータ・タイプにプロモート可能かどうかを判別するために、それぞれの候補関数が評価されます。
    • 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
    • 2 番目の引数については、VARCHAR を INTEGER にプロモートできないため、候補関数が残らないように、すべての候補関数が除去されます。
  • 上からの候補関数のサブセットが空のため、候補関数はキャスト可能なプロセスを使用して考慮されます。
    • 最初の引数については、候補となるすべての関数にこのパラメーター・タイプと 完全に一致するデータ・タイプが含まれます。
    • 2 番目の引数については、候補関数のどれにも対応する引数をプロモートできるパラメーターがないため、候補関数は除去されません。
    • 3 番目の引数は ACT_1 のパラメーターにプロモートできますが、ACT_2 または ACT_3 のパラメーターにはプロモートできないため、ACT_1 が最適です。
変更の終わり