SQL 解説書

CREATE FUNCTION (ソースまたはテンプレート)

このステートメントは、以下の目的で使用されます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 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----------------------------------------------'
 
>----*---------------------------------------------------------><
 

説明

function-name
定義する関数または関数テンプレートを指定します。 これは、関数を指定する修飾または非修飾の名前です。 function-name (関数名) の非修飾形式は SQL 識別子です (最大長 18)。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、 QUALIFIER プリコンパイル / バインド・オプションにより、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 修飾形式は、schema-name の後にピリオドと SQL 識別子が続きます。

暗黙または明示の修飾子を含む名前、 およびパラメーターの数と各パラメーターのデータ・タイプ (データ・タイプの長さ、 精度、または位取りの各属性には関係なく) は、 カタログに記述されている関数または関数テンプレートを指定するものであってはなりません (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、 および 基本述部に記載されている比較演算子です。

既存の関数と同一の機能をユーザー定義特殊タイプに対してサポートする目的で、 その既存の関数に基づくユーザー定義関数を指定する場合は、 該当の既存の関数と同じ名前を使用することができます。 これにより、ユーザーは、追加定義の必要性を特に意識することなく、 同じ関数のユーザー定義特殊タイプ版を使用することができます。 一般に、関数のシグニチャーに何らかの差異がある場合には、 同じ名前を複数の関数に使用することができます。

(data-type,...)
関数または関数テンプレートの入力パラメーターの数を指定するとともに、 各パラメーターのデータ・タイプを指定します。 このリストには、 関数または関数テンプレートが受け取ることを予期している各パラメーターごとに、 1 つの項目を指定する必要があります。 パラメーターの数は 90 を超えることはできません。 この限界を超えると、エラー (SQLSTATE 54023) になります。

パラメーターのない関数または関数テンプレートも登録可能です。 この場合、指定するデータ・タイプがない場合でも、括弧はコーディングする必要があります。 たとえば、

  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 番目のステートメントは、 重複する関数とみなされ、エラーになります。

parameter-name
この関数の他のパラメーターすべての名前と異なる、 パラメーターの任意選択名を指定します。

data-type1
パラメーターのデータ・タイプを指定します。

ソース・スカラー関数では、 SOURCE 文節で指定された関数の対応するパラメーターのタイプにキャスト可能であれば、 任意の有効な SQL データ・タイプを使用できます (キャスト可能の定義については、 データ・タイプ間のキャストを参照してください)。 REF(type-name) データ・タイプを パラメーターのデータ・タイプとして指定することはできません。

関数がソース関数から派生するので、パラメーター化データ・タイプの長さ、精度、 または位取りを指定する必要はありません (指定は可能です)。 代わりに、CHAR() などのように、空の括弧を使用できます。 パラメーター化データ・タイプ は、特定の長さ、 位取り、または精度によって定義可能なデータ・タイプです。 パラメーター化データ・タイプは、ストリング・データ・タイプと 10 進データ・タイプです。

RETURNS
この文節は必須で、関数または関数テンプレートの出力を指定します。

data-type2
出力のデータ・タイプを指定します。

ソース関数の結果のタイプからキャスト可能である場合、 任意の有効な SQL データ・タイプ (特殊タイプも同様) が有効です (キャスト可能の定義については、 データ・タイプ間のキャストを参照してください)。

上記のソース関数からの派生関数のパラメーターの場合のように、 パラメーター化タイプのパラメーターを指定する必要はありません。 その代わりに、VARCHAR() のように、空の括弧を使用できます。

関数が他の関数に基づいている場合に RETURNS 文節のデータ・タイプの指定に適用される考慮事項と規則については、 (UDFRULE) ページも参照してください。

SPECIFIC specific-name
定義する関数のインスタンスに対する固有名を指定します。 この特定名は、この関数をソース関数として使用する場合、 この関数を除去する場合、またはこの関数にコメントを付ける場合に使用することができます。 これは、関数の呼び出しには使用できません。 specific-name (特定名) の非修飾形式は SQL 識別子です (最大長 18)。 修飾形式は、schema-name の後にピリオドと SQL 識別子が続きます。 暗黙または明示の修飾子も含め、その名前が、 アプリケーション・サーバーに存在する別の関数インスタンスを指定するものであってはなりません。 そうでない場合、エラー (SQLSTATE 42710) になります。

specific-name は、既存の関数名 と同じであっても構いません。

修飾子を指定しない場合、function-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 function-name の明示修飾子または暗黙修飾子と同じでなければなりません。 そうでない場合、エラー (SQLSTATE 42882) になります。

specific-name の指定がない場合、 固有の名前がデータベース・マネージャーによって生成されます。 生成される固有の名前は、 SQL の後に文字のタイム・スタンプが続く名前です (SQLyymmddhhmmssxxx)。

SOURCE
作成する関数が、データベース・マネージャーにとって 既知の他の関数 (ソース関数) によって実装される関数であることを指定します。 ソース関数は、組み込み関数 71 、 または以前に作成したユーザー定義のスカラー関数のいずれかになります。

SOURCE 文節は、スカラー関数または列関数に対してのみ指定が可能で、 表関数には指定できません。

SOURCE 文節によって、他の関数と同一の機能を持たせることが可能になります。

function-name
ソースとして使用される特定の関数を指定します。 スキーマにこの function-name を名前とする特定の関数が、 ちょうど 1 つだけ存在している場合にのみ有効です。 この構文変数は、組み込み関数であるソース関数に対しては無効です。

非修飾名を指定すると、 許可 ID の現行 SQL パス (CURRENT PATH 特殊レジスターの値) がその関数を見つけるのに使用されます。 この名前の関数の含まれている関数パスの最初のスキーマが選択されます。

指定されたスキーマにこの名前の関数が見つからないか、 あるいは名前が修飾されておらず、この名前の関数が関数パスにない場合は、 エラー (SQLSTATE 42704) になります。 指定したスキーマまたは見つかったスキーマに、 この関数の特定インスタンスが複数個ある場合には、 エラー (SQLSTATE 42725) になります。

SPECIFIC specific-name
関数の作成時に指定されたか、 またはデフォルト値として使用された specific-name (特定名) を使用して、 ソースとして使用する特定のユーザー定義関数を指定します。 この構文変数は、組み込み関数であるソース関数に対しては無効です。

非修飾名を指定すると、許可 ID の現行 SQL パスが関数を見つけるのに使用されます。 この特定名の関数が含まれている関数パスの最初のスキーマが選択されます。

指定されたスキーマにこの specific-name の関数が見つからないか、 あるいは名前が修飾されておらず、 この specific-name の関数が SQL パスにない場合は、 エラー (SQLSTATE 42704) になります。

function-name (data-type,...)
ソース関数を固有に指定する関数シグニチャーを指定します。 組み込み関数であるソース関数に対しては、これが唯一有効な構文変数です。

同じ関数名と SOURCE 文節に指定されたデータ・タイプを持つ複数の関数の中から 1 つの関数を選択するために、 関数解決の規則が適用されます (関数解決 を参照してください)。 ただし、選択された関数の各パラメーターのデータ・タイプは、 ソース関数に指定された対応するデータ・タイプと、まったく同じタイプでなければなりません。

function-name
ソース関数の関数名を指定します。 非修飾名を指定すると、ユーザーの SQL パスのスキーマが考慮されます。

data-type
これは、CREATE FUNCTION ステートメントで対応する位置 (コンマで区切られた) に指定された データ・タイプに一致していなければなりません。

パラメーター化データ・タイプの長さ、精度、 または位取りを指定する必要はありません。 代わりに、空の括弧をコーディングすることによって、 データ・タイプの一致を調べる際にそれらの属性を無視するように指定することができます。 たとえば、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) になります。

AS TEMPLATE
このステートメントが、実行可能コードを含む関数ではなく、 関数テンプレートを作成するために使われることを示しています。

規則

例 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


脚注:

71
COALESCE、NODENUMBER、NULLIF、PARTITION、TYPE_ID、TYPE_NAME、 TYPE_SCHEMA および VALUE は例外です。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]