このステートメントは、以下の目的で使用されます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 SQL ステートメントを使用して発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
許可 ID の権限が不十分で、操作を実行できない場合には、 エラー (SQLSTATE 42502) になります。
SOURCE 文節で参照される関数に対する権限は必要ありません。
構文
>>-CREATE FUNCTION--function-name-------------------------------> >----(--+------------------------------------------+---)---*----> | .-,----------------------------------. | | V | | '----+-----------------+---data-type1---+--' '-parameter-name--' >----RETURNS--data-type2---*----+--------------------------+----> '-SPECIFIC--specific-name--' >----*----------------------------------------------------------> >-----+-SOURCE--+-function-name--------------------------------+-+> | +-SPECIFIC--specific-name----------------------+ | | '-function-name--(--+-------------------+---)--' | | | .-,-----------. | | | | V | | | | '----data-type---+--' | '-AS TEMPLATE----------------------------------------------' >----*---------------------------------------------------------><
説明
暗黙または明示の修飾子を含む名前、 およびパラメーターの数と各パラメーターのデータ・タイプ (データ・タイプの長さ、 精度、または位取りの各属性には関係なく) は、 カタログに記述されている関数または関数テンプレートを指定するものであってはなりません (SQLSTATE 42723)。 非修飾名とパラメーターの数およびデータ・タイプとの組み合わせは、 そのスキーマ内では当然固有ですが、複数のスキーマ間で固有である必要はありません。
2 つの部分から成る名前を指定する場合、 "SYS" で始まる schema-name (スキーマ名) は使用できません。 使用した場合、エラー (SQLSTATE 42939) になります。
述部のキーワードとして使用される多くの名前は、システム使用として予約されており、 function-name として使用することはできません (SQLSTATE 42939)。 それに含まれる名前は、 SOME、 ANY、 ALL、 NOT、 AND、 OR、 BETWEEN、 NULL、 LIKE、 EXISTS、 IN、 UNIQUE、 OVERLAPS、 SIMILAR、 MATCH、 および 基本述部に記載されている比較演算子です。
既存の関数と同一の機能をユーザー定義特殊タイプに対してサポートする目的で、 その既存の関数に基づくユーザー定義関数を指定する場合は、 該当の既存の関数と同じ名前を使用することができます。 これにより、ユーザーは、追加定義の必要性を特に意識することなく、 同じ関数のユーザー定義特殊タイプ版を使用することができます。 一般に、関数のシグニチャーに何らかの差異がある場合には、 同じ名前を複数の関数に使用することができます。
パラメーターのない関数または関数テンプレートも登録可能です。 この場合、指定するデータ・タイプがない場合でも、括弧はコーディングする必要があります。 たとえば、
CREATE FUNCTION WOOFER() ...
その対応するすべてのパラメーターのタイプがまったく同じである場合でも、 1 つのスキーマ中に名前が同じ 2 つの関数または関数テンプレートがあってはなりません。 (この制限は、同じ名前を持つスキーマ内の関数または関数テンプレートにも適用されます。) このタイプの比較では長さ、精度、および位取りは考慮されません。 したがって、CHAR(8) と CHAR(35)、また DECIMAL(11,2) と DECIMAL (4,3) は、 それぞれ同じタイプとみなされます。 さらに、DECIMAL と NUMERIC などのように、 この目的で複数のタイプが同じタイプとして扱われることがあります。 シグニチャーが重複していると、SQL エラー (SQLSTATE 42723) になります。
たとえば、次のステートメントの場合、
CREATE FUNCTION PART (INT, CHAR(15)) ... CREATE FUNCTION PART (INTEGER, CHAR(40)) ... CREATE FUNCTION ANGLE (DECIMAL(12,2)) ... CREATE FUNCTION ANGLE (DEC(10,7)) ...
2 番目と 4 番目のステートメントは、 重複する関数とみなされ、エラーになります。
ソース・スカラー関数では、 SOURCE 文節で指定された関数の対応するパラメーターのタイプにキャスト可能であれば、 任意の有効な SQL データ・タイプを使用できます (キャスト可能の定義については、 データ・タイプ間のキャストを参照してください)。 REF(type-name) データ・タイプを パラメーターのデータ・タイプとして指定することはできません。
関数がソース関数から派生するので、パラメーター化データ・タイプの長さ、精度、 または位取りを指定する必要はありません (指定は可能です)。 代わりに、CHAR() などのように、空の括弧を使用できます。 パラメーター化データ・タイプ は、特定の長さ、 位取り、または精度によって定義可能なデータ・タイプです。 パラメーター化データ・タイプは、ストリング・データ・タイプと 10 進データ・タイプです。
ソース関数の結果のタイプからキャスト可能である場合、 任意の有効な SQL データ・タイプ (特殊タイプも同様) が有効です (キャスト可能の定義については、 データ・タイプ間のキャストを参照してください)。
上記のソース関数からの派生関数のパラメーターの場合のように、 パラメーター化タイプのパラメーターを指定する必要はありません。 その代わりに、VARCHAR() のように、空の括弧を使用できます。
関数が他の関数に基づいている場合に RETURNS 文節のデータ・タイプの指定に適用される考慮事項と規則については、 (UDFRULE) ページも参照してください。
specific-name は、既存の関数名 と同じであっても構いません。
修飾子を指定しない場合、function-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 function-name の明示修飾子または暗黙修飾子と同じでなければなりません。 そうでない場合、エラー (SQLSTATE 42882) になります。
specific-name の指定がない場合、 固有の名前がデータベース・マネージャーによって生成されます。 生成される固有の名前は、 SQL の後に文字のタイム・スタンプが続く名前です (SQLyymmddhhmmssxxx)。
SOURCE 文節は、スカラー関数または列関数に対してのみ指定が可能で、 表関数には指定できません。
SOURCE 文節によって、他の関数と同一の機能を持たせることが可能になります。
非修飾名を指定すると、 許可 ID の現行 SQL パス (CURRENT PATH 特殊レジスターの値) がその関数を見つけるのに使用されます。 この名前の関数の含まれている関数パスの最初のスキーマが選択されます。
指定されたスキーマにこの名前の関数が見つからないか、 あるいは名前が修飾されておらず、この名前の関数が関数パスにない場合は、 エラー (SQLSTATE 42704) になります。 指定したスキーマまたは見つかったスキーマに、 この関数の特定インスタンスが複数個ある場合には、 エラー (SQLSTATE 42725) になります。
非修飾名を指定すると、許可 ID の現行 SQL パスが関数を見つけるのに使用されます。 この特定名の関数が含まれている関数パスの最初のスキーマが選択されます。
指定されたスキーマにこの specific-name の関数が見つからないか、 あるいは名前が修飾されておらず、 この specific-name の関数が SQL パスにない場合は、 エラー (SQLSTATE 42704) になります。
同じ関数名と SOURCE 文節に指定されたデータ・タイプを持つ複数の関数の中から 1 つの関数を選択するために、 関数解決の規則が適用されます (関数解決 を参照してください)。 ただし、選択された関数の各パラメーターのデータ・タイプは、 ソース関数に指定された対応するデータ・タイプと、まったく同じタイプでなければなりません。
パラメーター化データ・タイプの長さ、精度、 または位取りを指定する必要はありません。 代わりに、空の括弧をコーディングすることによって、 データ・タイプの一致を調べる際にそれらの属性を無視するように指定することができます。 たとえば、DECIMAL() は、 データ・タイプが DECIMAL(7,2) として定義されているパラメーターと一致します。
パラメーター値が異なるデータ・タイプ (REAL または DOUBLE) を示しているため、 FLOAT() を使用することはできません (SQLSTATE 42601)。
ただし、長さ、精度、または位取りをコーディングする場合、 その値は、CREATE FUNCTION ステートメントにおける指定に完全に一致していなければなりません。 これは、意図した通りの関数が確実に使用されるようにする場合に便利です。 また、データ・タイプの同義語は一致とみなされることにも注意してください (たとえば、 DEC と NUMERIC は一致します)。
0 <n<25 は REAL を意味し、24<n<54 は DOUBLE を意味するので、 FLOAT(n) のタイプは、n に定義された値と一致している必要はありません。 タイプが REAL か DOUBLE かによって、生じる一致は異なってきます。
指定したスキーマまたは暗黙のスキーマに、指定したシグニチャーを持つ関数がない場合は、 エラー (SQLSTATE 42883) になります。
規則
これらの規則に違反すると、エラー (SQLSTATE 42613) になります。
代わりに、VARCHAR() のように、データ・タイプの一部として空の括弧を使用することにより、 長さ、精度、および位取りがソース関数と同じであるか、 あるいはキャストによって決定されることを指定することができます。
ただし、長さ、精度、または位取りを指定した場合には、 CF における値と SF の対応する値とが比較検査されます。 これについては、以下で入力パラメーターと戻り値とに分けて説明します。
この規則は、CF の使用時に発生し得るエラーに対して何らかの保証を与えるものではありません。 CF パラメーターのデータ・タイプや長さ、または精度属性に一致する引き数は、 対応する SF パラメーターの方が長さが短かったり精度が劣る場合には、 割り当てることができません。 一般に、CF のパラメーターの長さ属性や精度属性は、 対応する SF パラメーターのそれよりも大きくしてはなりません。
この規則は、CF の使用時に発生し得るエラーに対して何らかの保証を与えるものではありません。 SF の RETURNS データ・タイプのデータ・タイプや長さもしくは精度属性に一致する結果の値は、 CF の RETURNS データ・タイプの方が長さが短かったり精度が劣る場合には、 割り当てることができません。 長さもしくは精度属性が SF の RETURNS データ・タイプのそれよりも 小さい CF の RETURNS データ・タイプを指定することにした場合は、 十分に注意を払ってください。
注
対となる部分は、関数 (スカラーまたはソース) か、関数テンプレートとすることができます。 ユーザーが関数を作成して必要なマッピングを行うと、 その関数を指定する照会を処理するたびに、DB2 は、 (1) その関数を呼び出すときの戦略と、データ・ソース関数を呼び出すときの戦略を比べ、 (2) オーバーヘッドが少ないと思われる関数を呼び出します。
ユーザーが関数テンプレートとマッピングを作成すると、 そのテンプレートを指定する照会を処理するたびに、DB2 は、 マッピング先のデータ・ソース関数を呼び出します (ただし、 この関数を呼び出すためのアクセス・プランが存在する場合)。 連合システムでの関数呼び出し時のオーバーヘッドの制御については、 アプリケーション開発の手引き を参照してください。
例
例 1: Pellow がオリジナルの CENTRE 関数を作成した後に、 別のユーザーがその関数に基づいて関数を作成します。 この関数は、整数引き数のみを受け入れるという点だけが異なります。
CREATE FUNCTION MYCENTRE (INTEGER, INTEGER) RETURNS FLOAT SOURCE PELLOW.CENTRE (INTEGER, FLOAT)
例 2: 組み込みの INTEGER データ・タイプに基づく特殊タイプ HATSIZE が作成済みで、 AVG 関数を使用してそれぞれの部門の平均の帽子サイズを計算したいとします。 これは、以下のようにして簡単に実行できます。
CREATE FUNCTION AVG (HATSIZE) RETURNS (HATSIZE) SOURCE SYSIBM.AVG (INTEGER)
特殊タイプの作成により必要な cast 関数が生成され、 引き数の場合は HATSIZE から INTEGER に、 関数の結果の場合は INTEGER から HATSIZE にキャストすることが可能です。
例 3: 連合システムで、 表統計を倍精度浮動小数点付きの値で戻す Oracle UDF を起動します。 連合サーバーは、この関数と連合データベース側の対の関数との間でマッピングが行われる場合にだけ、 この関数を認識することができます。 ところが、そのような対の関数は存在していません。 それで、対の関数を関数テンプレートの形で指定すること、 そしてこのテンプレートを NOVA というスキーマに割り当てることを決定します。 次のコードを使用して、テンプレートを連合サーバーに登録します。 マッピング用のコードについては、例 を参照してください。
CREATE FUNCTION NOVA.STATS (DOUBLE, DOUBLE) RETURNS DOUBLE AS TEMPLATE
例 4: 連合システムで、 特定の組織の従業員に対して支給されるボーナスの総額を戻す Oracle UDF を呼び出します。 連合サーバーは、この関数と連合データベース側の対の関数との間でマッピングが行われる場合にだけ、 この関数を認識することができます。 ところがそのような対の関数は存在しないため、ユーザーが関数テンプレートの形で作成します。 次のコードを使用して、このテンプレートを連合サーバーに登録します。 マッピング用のコードについては、例 を参照してください。
CREATE FUNCTION BONUS () RETURNS DECIMAL (8,2) AS TEMPLATE