このステートメントは、 ユーザー定義の SQL スカラー、表、または行関数を定義するのに使用されます。 スカラー関数 は、呼び出されるたびに 1 つの値を戻し、 SQL 式が有効な個所であればどこでも有効です。 表関数 は、FROM 文節で使用でき、表を戻します。 行関数 は、変形関数として使用でき、行を戻します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 SQL ステートメントを使用して発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
このステートメントの許可 ID に SYSADM 権限または DBADM 権限がなく、 関数が表または視点を指定する場合、 ステートメントの権限 ID が持つ特権 (GROUP 特権は考慮に入れない) には、 表および視点それぞれに SELECT WITH GRANT OPTION が組み込まれていなければなりません。
関数の定義者が SYSADM 権限を持つために、関数の作成しかできない場合、 関数作成のため、その定義者には暗黙的に DBADM 権限が付与されます。
許可 ID の権限が不十分で、操作を実行できない場合には、エラー (SQLSTATE 42502) になります。
構文
>>-CREATE FUNCTION--function-name-------------------------------> >----(--+------------------------------------+---)---*----------> | .-,----------------------------. | | V | | '----parameter-name--data-type1---+--' >----RETURNS--+-data-type2--------------------+--*--------------> '--+-ROW---+---| column-list |--' '-TABLE-' .-LANGUAGE SQL--. >-----+--------------------------+--*----+---------------+--*---> '-SPECIFIC--specific-name--' .-NOT DETERMINISTIC--. .-EXTERNAL ACTION----. >-----+--------------------+--*----+--------------------+--*----> '-DETERMINISTIC------' '-NO EXTERNAL ACTION-' .-READS SQL DATA--. .-STATIC DISPATCH--. >-----+-----------------+--*----+------------------+--*---------> '-CONTAINS SQL----' (1) .-CALLED ON NULL INPUT-------. >-----+----------------------------+--*-------------------------> >-----+-----------------------------------------------------+---> | (2) | '-PREDICATES--(--| predicate-specification |--)-------' >----RETURN--+-expression----------------------------------------------+> +-NULL----------------------------------------------------+ '-+---------------------------------------+---fullselect--' | .-,--------------------------. | | V | | '-WITH-----common-table-expression---+--' >-------------------------------------------------------------->< column-list .-,--------------------------. V | |---(-----column-name--data-type3---+---)-----------------------|
注:
説明
暗黙または明示の修飾子を含む名前、 およびパラメーターの数と各パラメーターのデータ・タイプ (データ・タイプの長さ、 精度、または位取りの各属性には関係なく) は、 カタログに記述されている関数を指定するものであってはなりません (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-type1 で説明した SQL 関数のパラメーターと同じ考慮事項が適用されます。
行関数は、構造タイプの変換関数としてのみ使用できます (1 つの構造タイプをパラメーターとして使用し、基本タイプのみ戻します)。
specific-name は、既存の関数名 と同じであっても構いません。
修飾子を指定しない場合、function-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 function-name の明示修飾子または暗黙修飾子と同じでなければなりません。 そうでない場合、エラーになります (SQLSTATE 42882)。
specific-name の指定がない場合、 固有の名前がデータベース・マネージャーによって生成されます。 生成される固有の名前は、 SQL の後に文字のタイム・スタンプが続く名前です (SQLyymmddhhmmssxxx)。
関数の本体が特殊レジスターにアクセスしたり、他の非 deterministic 関数を呼び出す場合には、 NOT DETERMINISTIC を明示的または暗黙的に指定しなければなりません (SQLSTATE 428C2)。
関数の本体が外部アクションのある別の関数を呼び出す場合、 EXTERNAL ACTION を明示的または暗黙的に指定しなければなりません (SQLSTATE 428C2)。
CALLED ON NULL INPUT の代わりに NULL CALL という句を使用できます。
この関数がスカラー関数である場合、全選択は 1 つの列 (SQLSTATE 42823) と、 最大で 1 つの行を戻さなければなりません (SQLSTATE 21000)。
この関数が行関数の場合、多くて 1 つの行を戻さなければなりません (SQLSTATE 21505)。
この関数が表関数の場合、1 つまたは複数の列で 0 以上の行を戻せます。
注
上記の規則で parameter-types を比較する目的で、以下のようになります。
例
例 1: 既存のサインおよびコサイン関数を使用して、 値のタンジェントを戻すスカラー関数を定義します。
CREATE FUNCTION TAN (X DOUBLE) RETURNS DOUBLE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN SIN(X)/COS(X)
例 2: 構造タイプ PERSON の変形関数を定義します。
CREATE FUNCTION FROMPERSON (P PERSON) RETURNS ROW (NAME VARCHAR(10), FIRSTNAME VARCHAR(10)) LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN VALUES (P..NAME, P..FIRSTNAME)
例 3: 指定された部門番号の従業員を戻す表関数を定義します。
CREATE FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3)) RETURNS TABLE (EMPNO CHAR(6), LASTNAME VARCHAR(15), FIRSTNAME VARCHAR(12)) LANGUAGE SQL READS SQL DATA NO EXTERNAL ACTION DETERMINISTIC RETURN SELECT EMPNO, LASTNAME, FIRSTNME FROM EMPLOYEE WHERE EMPLOYEE.WORKDEPT = DEPTEMPLOYEES.DEPTNO
この関数の定義者は EMPLOYEE 表で SELECT WITH GRANT OPTION 特権を持っていなければならないことと、 すべてのユーザーが表関数 DEPTEMPLOYEES を呼び出して、 各部門番号の結果列でデータへのアクセスを効果的に行えることに注意してください。