CREATE FUNCTION (集約インターフェース) ステートメント

CREATE FUNCTION (集約インターフェース) ステートメントを使用して、現行サーバーにユーザー定義集約関数を登録します。

集約関数は、類似した値の集合 (一連の行の列値など) の評価結果として 1 つの値を戻します。

呼び出し

このステートメントはアプリケーション・プログラムに組み込んだり、動的 SQL ステートメントで発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • データベースに対する IMPLICIT_SCHEMA 権限 (関数のスキーマ名が既存のスキーマを指していない場合)
  • スキーマに対する CREATEIN 特権 (関数のスキーマ名が既存のスキーマを指している場合)
  • DBADM 権限
このステートメントの許可 ID に DATAACCESS 権限がない場合、ステートメントの許可 ID が持つ特権に、以下のルーチンに対する EXECUTE 特権も含まれていなければなりません。
  • INITIATE
  • ACCUMULATE
  • MERGE
  • FINALIZE

CREATE FUNCTION ステートメントで指定する従属オブジェクトに対しては、PUBLIC 以外のグループ特権は意味を持ちません。

既存の関数を置換するには、ステートメントの許可 ID が既存の関数の所有者でなければなりません (SQLSTATE 42501)。

SECURED オプションを指定する場合は、 ステートメントの許可 ID に、SECADM または CREATE_SECURE_OBJECT 権限が含まれている必要があります (SQLSTATE 42501)。

構文

構文図を読む構文図をスキップする CREATE OR REPLACE FUNCTION function-name ( ,parameter-declaration ) RETURNS data-type2data-type3CAST FROMdata-type4 option-list AGGREGATE WITH (,state-variable-declaration) USING IN MODULEmodule-name INITIALIZE procedure-designator ACCUMULATE procedure-designator MERGE procedure-designator FINALIZE function-designator
parameter-declaration
構文図を読む構文図をスキップするINparameter-name data-type1 default-clause
data-type1、data-type2、data-type3、data-type4、data-type5
構文図を読む構文図をスキップする built-in-type
built-in-type
構文図を読む構文図をスキップするSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XMLSYSPROC.DB2SECURITYLABEL23
default-clause
構文図を読む構文図をスキップする DEFAULT NULLconstantspecial-registerglobal-variable(expression)
option-list
構文図を読む構文図をスキップする SPECIFIC specific-name NOT DETERMINISTICDETERMINISTIC CALLED ON NULL INPUT EXTERNAL ACTIONNO EXTERNAL ACTION NO SCRATCHPAD NO FINAL CALL ALLOW PARALLEL NOT SECUREDSECURED
state-variable-declaration
構文図を読む構文図をスキップする state-variable-name data-type5
procedure-designator
構文図を読む構文図をスキップする PROCEDUREprocedure-name(,data-type)SPECIFIC PROCEDUREspecific-name
function-designator
構文図を読む構文図をスキップする FUNCTIONfunction-name(,data-type)SPECIFIC FUNCTIONspecific-name
注:
  • 1 FOR BIT DATA 節とその後に続く他の列制約とは、任意の順序で指定できます。FOR BIT DATA 節をストリング単位 CODEUNITS32 とともに指定することはできません (SQLSTATE 42613)。
  • 2 Db2SECURITYLABEL は、保護対象表の行セキュリティー・ラベル列を定義するために使用しなければならない組み込み特殊タイプです。
  • 3 タイプ Db2SECURITYLABEL の列の場合、NOT NULL WITH DEFAULT は暗黙指定になるので、明示的に指定することはできません (SQLSTATE 42842)。タイプ Db2SECURITYLABEL の列のデフォルト値は、セッション許可 ID の書き込みアクセスのためのセキュリティー・ラベルです。

説明

OR REPLACE
関数の定義が現行のサーバー上に存在している場合に、その関数の定義を置換するために指定します。 既存の定義は、新しい定義がカタログ内で置換される前に効率的にドロップされます。ただし、関数に対して付与された特権は影響を受けないという例外があります。 このオプションは、オブジェクトの所有者しか指定できません。このオプションは、関数の定義が現行のサーバー上に存在しない場合は無視されます。 以下のいずれかの条件が該当する場合、既存の関数を置き換えることができます。
  • 新規定義の特定名および関数名は、旧定義の特定名および関数名と同じでなければならない
  • 新規定義のシグニチャーは、旧定義のシグニチャーと一致しなければならない
これら以外の場合、新規関数が作成されます。

関数が行権限または列マスクの定義で参照されている場合、関数を置換することはできません (SQLSTATE 42893)。

function-name
定義する関数の名前を指定します。これは、関数を指定する修飾または非修飾の名前です。 function-name の非修飾形式は SQL ID です。動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 修飾形式は、schema-name の後にピリオドと SQL ID が続きます。 最初のパラメーターが構造化タイプの場合、修飾名は、 最初のパラメーターのデータ・タイプと同じであってはなりません。

関数シグニチャーは、カタログで記述されている関数またはメソッドを指定するものであってはなりません (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 および比較演算子です。

一般に、関数シグニチャーがそれぞれ異なっている場合は、同じ名前を複数の関数に使用することができます。

禁止されてはいませんが、意図的にオーバーライドを行う場合を除き、集約インターフェース関数の名前として、組み込み関数と同じ名前を指定しないでください。 MAX、MIN、AVG などの関数がこれに該当します。 ユーザー定義関数を作成する場合、動作は異なっていても、組み込みのスカラー関数や集約関数と名前が同じで引数に整合性がある関数にすると、問題が生じる可能性があります。 例えば、以下の例があります。
  • 動的 SQL ステートメントで問題が生じる
  • 静的 SQL アプリケーションを再バインドするときに失敗する可能性がある
  • アプリケーションが正常に実行されたように見えるが、結果が異なる
(parameter-declaration,...)
関数の入力パラメーターの数を指定するとともに、各パラメーターのモード、名前、データ・タイプ、デフォルト値 (オプション) を指定します。 このリストには、 関数が受け取ることを予期している各パラメーターごとに 1 つの項目を指定する必要があります。 最大 90 までパラメーターを指定できます (SQLSTATE 54023)。
パラメーターのない関数を登録できます。この場合、指定するデータ・タイプがない場合でも、括弧はコーディングする必要があります。 以下に例を示します。
   CREATE FUNCTION WOOFER() ...
同じスキーマで同一の名前を持つ 2 つの関数を作成するときに、対応するすべてのパラメーターに同じタイプを指定することはできません。 このタイプの比較では長さ、精度、および位取りは考慮されません。 したがって、CHAR(8) と CHAR(35)、また DECIMAL(11,2) と DECIMAL (4,3) は、 それぞれ同じタイプと見なされます。 緩やかに型付けされた特殊タイプをパラメーターに指定した場合、その特殊タイプは、特殊タイプのソース・タイプと同じデータ・タイプと見なされます。Unicode データベースの場合には、CHAR(13) と GRAPHIC(8) は、それぞれ同じタイプと見なされます。さらに、DECIMAL と NUMERIC などのように、この目的で複数のタイプが同じタイプとして扱われます。 シグニチャーが重複していると、エラー (SQLSTATE 42723) を戻します。
IN
パラメーターを関数の入力パラメーターとして指定します。 制御が戻されると、関数内のパラメーターに加えられたどのような変更も、呼び出し側コンテキストで利用できません。
parameter-name
パラメーターのオプション名を指定します。この名前は、パラメーター・リスト内の他のすべての parameter-name と同じにすることはできません (SQLSTATE 42734)。
data-type1
パラメーターのデータ・タイプを指定します。 組み込みデータ・タイプを指定できます。それぞれの組み込みデータ・タイプの詳細については、CREATE TABLE ステートメントを参照してください。データ・タイプとして、XML、CLOB、DBCLOB、BLOB は指定できません。(SQLSTATE 42815)。データ・タイプとして、特殊タイプは指定できません (SQLSTATE 42611)。
DEFAULT
パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。デフォルトとして指定できる特殊レジスターは、列のデフォルトとして指定できる特殊レジスターと同じです (CREATE TABLE ステートメントdefault-clause を参照)。他の特殊レジスターは、式を使用することによってデフォルトとして指定できます。

この式は、『』で説明されているいずれかのタイプの式とすることができます。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、対応する引数はプロシージャーの呼び出し時に省略できません。式の最大サイズは 64 KB です。

デフォルトの式は、SQL データを変更してはなりません (SQLSTATE 428FL または SQLSTATE 429BL)。式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません (SQLSTATE 42821)。

RETURNS
これは必須の節であり、関数の出力を指定します。
data-type2
出力のデータ・タイプを指定します。

この場合、関数パラメーターの data-type1 で説明したものと同じ考慮事項が当てはまります。

データ・タイプとして、特殊タイプは指定できません (SQLSTATE 42611)。

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

この形式の RETURNS 節は、FINALIZE 関数の関数コードから返されたデータ・タイプとは異なるデータ・タイプを呼び出しステートメントに返します。 例:

   CREATE FUNCTION GET_HIRE_DATE(CHAR(6))
     RETURNS DATE CAST FROM CHAR(10)
     ...

上記のコードでは、関数コードが CHAR(10) 値をデータベース・マネージャーに返します。 データベース・マネージャーはそれを DATE に変換し、その値を呼び出しステートメントに渡します。 data-type4 は、 data-type3 パラメーターにキャスト可能でなければなりません。 キャスト可能でない場合、エラー (SQLSTATE 42880) が戻されます。

data-type3 の長さ、精度、または位取りは、data-type4 から推断することができます。 data-type3 のパラメーター化されたタイプの長さ、精度、または位取りを指定することはできますが、必須ではありません。 その代わりに、空の括弧を使用できます。 例えば、VARCHAR() を使用することができます。 FLOAT() は、パラメーター値によって異なるデータ・タイプ (REAL または DOUBLE) を表すので、使用できません (SQLSTATE 42601)。

特殊タイプは、data-type3data-type4 に指定するタイプとしては無効です (SQLSTATE 42815)。

キャスト操作は、変換エラーになる可能性がある実行時検査の対象にもなります。

built-in-type
組み込みデータ・タイプの説明については、CREATE TABLE ステートメントを参照してください。
option-list
SPECIFIC specific-name
定義する関数のインスタンスに対する固有名を指定します。 この特定名は、この関数をソース関数として使用する場合、 この関数をドロップする場合、またはこの関数にコメントを付ける場合に使用することができます。 これは、関数の呼び出しには使用できません。 specific-name の非修飾形式は SQL ID です。修飾形式は、schema-name の後にピリオドと SQL ID が続きます。 暗黙または明示の修飾子も含め、その名前が、アプリケーション・サーバーに存在する別の関数インスタンスまたはメソッド指定を識別するものであってはなりません。そうでない場合、エラー (SQLSTATE 42710) が戻されます。

specific-name は、既存の function-name と同じにすることができます。

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

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

DETERMINISTIC または NOT DETERMINISTIC
この節は任意指定で、 特定の引数の値に対して関数が常に同じ結果を戻すか (DETERMINISTIC)、 それとも状態値に依存して関数の結果が影響を受けるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC を伴う関数は、 連続で同じ入力を指定して呼び出しが行われた場合に常に同じ結果を戻します。 NOT DETERMINISTIC を指定すると、 同じ入力によって常に同じ結果が生じることを利用した最適化ができなくなります。 乱数を生成する関数は、NOT DETERMINISTIC 関数の例です。 入力の平方根を求める関数は、DETERMINISTIC 関数の例です。DETERMINISTIC が指定される場合、指定される INITIALIZE、ACCUMULATE、MERGE、および FINALIZE ルーチンも DETERMINISTIC にする必要があります (SQLSTATE 428IA)。
CALLED ON NULL INPUT
CALLED ON NULL INPUT は、集約インターフェース関数に常に適用されます。 つまり、引数の値のセットがすべて NULL かどうかに関係なく、関数が呼び出されます。 指定される INITIALIZE、ACCUMULATE、および MERGE プロシージャーも常に CALLED ON NULL INPUT になります。それらはプロシージャーだからです。 指定される FINALIZE 関数も CALLED ON NULL INPUT でなければなりません (SQLSTATE 428IA)。 コンポーネント・ルーチンのどのパラメーターも、NULL 値を返す場合と通常の (ヌル以外の) 値を返す場合があります。 NULL の引数値の有無のテストはコンポーネント・ルーチンで行う必要があります。
EXTERNAL ACTION または NO EXTERNAL ACTION
データベース・マネージャーが管理しないオブジェクトの状態を変更するアクションが関数にあるかどうかを指定します。 外部アクションの例としては、メッセージの送信やファイルへのレコードの書き込みがあります。 デフォルトは EXTERNAL ACTION です。
EXTERNAL ACTION
データベース・マネージャーが管理しないオブジェクトの状態を変更するアクションが関数にあることを指定します。

外部アクションが指定された関数は、関数が並列タスクによって実行されると、不正確な結果を戻す場合があります。 例えば、初期呼び出しを受けるたびに注釈を送信する関数の場合、関数ごとに 1 つの注釈が送信されるのではなく、並列タスクごとに 1 回ずつ送信されることになります。

NO EXTERNAL ACTION
データベース・マネージャーが管理しないオブジェクトの状態を変更するアクションが関数にないことを指定します。 データベース・マネージャーは、SQL ステートメントの最適化中に、この情報を使用します。 NO EXTERNAL ACTION が指定される場合、指定される INITIALIZE、ACCUMULATE、MERGE、および FINALIZE ルーチンも NO EXTERNAL ACTION にする必要があります (SQLSTATE 428IA)。
NO SCRATCHPAD
この節はオプションであり、この外部関数に対してスクラッチパッドを用意するか否かを指定するのに使用することができます。集約インターフェース関数では NO SCRATCHPAD が許可されています。指定される INITIALIZE、ACCUMULATE、および MERGE プロシージャーは常に NO SCRATCHPAD になります。それらはプロシージャーだからです。指定される FINALIZE 関数も NO SCRATCHPAD でなければなりません (SQLSTATE 428IA)。
NO FINAL CALL
この節はオプションであり、 外部関数に対する最終呼び出しが行われるか否かを指定します。 集約インターフェース関数では NO FINAL CALL が許可されています。 指定される INITIALIZE、ACCUMULATE、および MERGE プロシージャーは常に NO FINAL CALL になります。それらはプロシージャーだからです。 指定される FINALIZE 関数も NO FINAL CALL でなければなりません (SQLSTATE 428IA)。
ALLOW PARALLEL
この節はオプションで、関数への 1 つの参照に対して、 関数の呼び出しを並列化できるか否かを指定します。 集約インターフェース関数では、ALLOW PARALLEL だけがサポートされます。
NOT SECURED または SECURED
関数が行および列のアクセス制御に対してセキュアであるどうかを指定します。デフォルトは NOT SECURED です。
NOT SECURED
関数がセキュアであると見なされないことを示します。この関数が呼び出されるとき、この関数の引数は、列マスクが有効で列レベルのアクセス制御がその表でアクティブ化されている列を参照できません (SQLSTATE 428HA)。この規則は、ステートメントのどこかで呼び出されるセキュアではないユーザー定義関数に適用されます。
SECURED
関数がセキュアであると見なされることを示します。
AGGREGATE
この節は必須です。CREATE FUNCTION ステートメントを使用してユーザー定義集約関数を登録することを指定します。
WITH
この節を使用して、集約関数の処理の各段階で受け渡せる状態変数を指定します。少なくとも 1 つの状態変数を定義する必要があります。
state-variable-name
状態変数の名前を指定します (任意指定です)。この関数定義の状態変数リストに含まれている他の state-variable-name と同じ名前にすることはできません (SQLSTATE 42734)。
data-type5
状態変数のデータ・タイプを指定します。

data-type1 で取り上げた関数パラメーターに関する注意点がここでも当てはまります。 ただし、XML、CLOB、DBCLOB、BLOB の各データ・タイプを状態変数のデータ・タイプとして使用することはできません (SQLSTATE 42611)。data-type5 のデータ・タイプとして、特殊タイプは指定できません (SQLSTATE 42611)。

表の行サイズに基づくバイト・カウント方式で、状態変数の合計バイト・カウントが 32677 を超えることはできません (SQLSTATE 42611)。

USING
この節は必須です。集約関数の処理の実装方法を指定します。USING 節では、集約関数の処理の各フェーズを実装する一連のユーザー定義プロシージャーと 1 つのユーザー定義スカラー関数を指定します。
IN MODULE module-name
この節は任意指定です。INITIALIZE、ACCUMULATE、MERGE、FINALIZE の各節で指定する 3 つのプロシージャーと 1 つの関数がモジュール module-name に入っていることを指定します。この節を指定する場合、procedure-designatorfunction-designator で指定する procedure-namefunction-namespecific-name は、非修飾名でなければなりません (SQLSTATE 42601)。
INITIALIZE procedure-designator
集約の初期化フェーズを実装する 1 つのプロシージャーを一意的に指定します。

出力パラメーターだけが定義されているプロシージャーを選択する必要があります。出力パラメーターの数は、AGGREGATE WITH 節で指定する状態変数の数と同じでなければなりません (SQLSTATE 428IA)。選択するプロシージャーの各出力パラメーターのデータ・タイプは、AGGREGATE WITH 節で指定するそれぞれの対応パラメーターのデータ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。

選択したプロシージャーで以下のオプションの組み合わせを指定してください (SQLSTATE 428IA)。
  • LANGUAGE C および NO SQL
  • LANGUAGE JAVA および NO SQL
  • LANGUAGE SQL および CONTAINS SQL

このプロシージャーは、ステートメントの実行時に存在していなければなりません。ただし、AUTO_REVAL データベース構成パラメーターが DEFERRED_FORCE に設定されている場合は別です。

ACCUMULATE procedure-designator
集約の累積フェーズを実装する 1 つのプロシージャーを一意的に指定します。
以下の基準を満たしたプロシージャーを選択する必要があります (SQLSTATE 428IA)。
  • まず、選択するプロシージャーの入力専用パラメーターの数は、集約関数で指定するパラメーターの数と同じでなければなりません。
  • 次に、選択するプロシージャーの INOUT パラメーターの数は、AGGREGATE WITH 節で指定する状態変数の数と同じでなければなりません。
選択するプロシージャーの各入力専用パラメーターのデータ・タイプは、parameter-declaration で指定するそれぞれの対応パラメーターのデータ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。選択するプロシージャーの各 INOUT パラメーターのデータ・タイプは、AGGREGATE WITH 節で指定するそれぞれの対応パラメーターのデータ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。
選択したプロシージャーで以下のオプションの組み合わせを指定してください (SQLSTATE 428IA)。
  • LANGUAGE C および NO SQL
  • LANGUAGE JAVA および NO SQL
  • LANGUAGE SQL および CONTAINS SQL

このプロシージャーは、ステートメントの実行時に存在していなければなりません。ただし、AUTO_REVAL データベース構成パラメーターが DEFERRED_FORCE に設定されている場合は別です。

MERGE procedure-designator
集約のマージ・フェーズを実装する 1 つのプロシージャーを一意的に指定します。
以下の基準を満たしたプロシージャーを選択する必要があります (SQLSTATE 428IA)。
  • まず、選択するプロシージャーの入力専用パラメーターの数は、AGGREGATE WITH 節で指定する状態変数の数と同じでなければなりません。
  • 次に、選択するプロシージャーの INOUT パラメーターの数は、AGGREGATE WITH 節で指定する状態変数の数と同じでなければなりません。
選択するプロシージャーの各入力専用パラメーターのデータ・タイプは、AGGREGATE WITH 節で指定するそれぞれの対応パラメーターのデータ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。選択するプロシージャーの各 INOUT パラメーターのデータ・タイプは、AGGREGATE WITH 節で指定するそれぞれの対応パラメーターのデータ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。
選択したプロシージャーで以下のオプションの組み合わせを指定してください (SQLSTATE 428IA)。
  • LANGUAGE C および NO SQL
  • LANGUAGE JAVA および NO SQL
  • LANGUAGE SQL および CONTAINS SQL

このプロシージャーは、ステートメントの実行時に存在していなければなりません。ただし、AUTO_REVAL データベース構成パラメーターが DEFERRED_FORCE に設定されている場合は別です。

FINALIZE function-designator
集約の最終結果フェーズを実装する 1 つのユーザー定義スカラー関数を一意的に指定します。

AGGREGATE WITH 節で指定する状態変数と同じ数の入力専用パラメーターが定義されている関数を選択する必要があります (SQLSTATE 428IA)。選択する関数の各入力専用パラメーターのデータ・タイプは、AGGREGATE WITH 節で指定するそれぞれの対応パラメーターのデータ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。選択する関数の出力データ・タイプは、RETURNS 節で指定する出力データ・タイプとまったく同じでなければなりません (SQLSTATE 428IA)。

選択したプロシージャーで以下のオプションの組み合わせを指定してください (SQLSTATE 428IA)。
  • LANGUAGE C および NO SQL
  • LANGUAGE JAVA および NO SQL
  • LANGUAGE SQL および CONTAINS SQL

この関数は、このステートメントの実行時に存在していなければなりません。ただし、AUTO_REVAL データベース構成パラメーターが DEFERRED_FORCE に設定されている場合は別です。

INITIALIZE、ACCUMULATE、MERGE、FINALIZE の各ルーチンの説明に出てきた「まったく同じデータ・タイプ」とは、長さ、精度、位取り、ストリング単位、および CCSID が同じであることを意味します。したがって、以下のデータ・タイプは異なるものと見なされます。
  • CHAR(8) と CHAR(35)
  • VARCHAR(10 OCTETS) と VARCHAR(10 CODEUNIT32)
  • DECIMAL(11,2) と DECIMAL (4,3)

緩やかに型付けされた特殊タイプは、その特殊タイプのソース・タイプとは別のデータ・タイプと見なされます。Unicode データベースの場合でも、CHAR(13) と GRAPHIC(13) は別々のタイプと見なされます。

procedure-designator
PROCEDURE procedure-name
特定のプロシージャーを指定します。procedure-name という名前のプロシージャー・インスタンスがスキーマ内にちょうど 1 つ存在している場合にのみ有効です。 指定するプロシージャーには、任意の数のパラメーターを定義できます。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 指定したスキーマまたは暗黙のスキーマに該当する名前のプロシージャーが存在しない場合は、 エラーが戻されます (SQLSTATE 42704)。指定したスキーマまたは暗黙のスキーマに、このプロシージャーのインスタンスが複数存在する場合は、エラー (SQLSTATE 42725) が戻されます。その名前のプロシージャーが存在し、ステートメントの許可 ID がプロシージャーに対して EXECUTE 特権を持っていない場合には、エラー (SQLSTATE 42501) が戻されます。
PROCEDURE procedure-name (data-type,...)
プロシージャーを一意的に固有に識別するプロシージャー・シグニチャーを指定します。 プロシージャー解決のアルゴリズムは使用されません。
procedure-name
プロシージャーの名前を指定します。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/ BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。
(data-type,...)
値は、CREATE PROCEDURE ステートメント上で (対応する位置に) 指定されたデータ・タイプに一致していなければなりません。 データ・タイプの数、およびデータ・タイプを論理的に連結した値が、 特定のプロシージャー・インスタンスを識別するのに使用されます。

data-type が修飾なしの場合は、SQL パス上でスキーマを検索してタイプ名が決定されます。

パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。 空の括弧をコーディングすることによって、 一致データ・タイプの検索時にそれらの属性を無視するように指定することができます。

FLOAT() は、パラメーター値によって異なるデータ・タイプ (REAL または DOUBLE) を表すので、使用できません (SQLSTATE 42601)。

長さ、精度、または位取りをコーディングする場合、 その値は、CREATE PROCEDURE ステートメントで指定された値と完全に一致していなければなりません。 文字ストリングおよびグラフィック・ストリングのデータ・タイプに対して長さが指定されている場合、その長さ属性のストリング単位は、CREATE PROCEDURE ステートメントで指定されたものと完全に一致していなければなりません。

0< n <25 は REAL を意味し、24< n <54 は DOUBLE を意味するので、FLOAT(n) のタイプは、n に定義された値と一致している必要はありません。マッチングは、タイプが REAL か DOUBLE かに基づいて行われます。

指定したスキーマまたは暗黙のスキーマに、 指定したシグニチャーを持つプロシージャーがない場合は、 エラー (SQLSTATE 42883) が戻されます。

そのプロシージャー・シグニチャーのプロシージャーが存在し、ステートメントの許可 ID がプロシージャーに対して EXECUTE 特権を持っていない場合には、エラー (SQLSTATE 42501) が戻されます。

SPECIFIC PROCEDURE specific-name
プロシージャーの作成時に指定された名前、またはデフォルト値として与えられた名前を使用して、特定のプロシージャーを指定します。動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 specific-name に指定される名前は、指定したスキーマまたは暗黙のスキーマに含まれる特定プロシージャーのインスタンスを識別するものでなければなりません。それ以外の名前が指定された場合は、エラーが戻されます (SQLSTATE 42704)。その specific-name という名前のプロシージャーが存在し、そのステートメントの許可 ID がこのプロシージャーに対する EXECUTE 特権を持っていない場合には、エラー (SQLSTATE 42501) が返されます。
FUNCTION function-name
特定の関数を指定します。function-name という名前の関数インスタンスがスキーマ内にちょうど 1 つ存在している場合にのみ有効です。 指定する関数には、任意の数のパラメーターを定義できます。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 指定したスキーマまたは暗黙のスキーマにこの名前の関数が存在しない場合は、エラー (SQLSTATE 42704) が戻されます。指定したスキーマまたは暗黙のスキーマに、この関数のインスタンスが複数存在する場合は、 エラー (SQLSTATE 42725) が戻されます。その名前の関数が存在し、ステートメントの許可 ID が関数に対して EXECUTE 特権を持っていない場合には、 エラー (SQLSTATE 42501) が戻されます。
function-designator
FUNCTION function-name (data-type,...)
関数を固有に指定する関数シグニチャーを指定します。 関数解決のアルゴリズムは使用されません。
function-name
関数の名前を指定します。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/ BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。
(data-type,...)
値は、CREATE FUNCTION ステートメント上で (対応する位置に) 指定されたデータ・タイプに一致していなければなりません。 データ・タイプの数、およびデータ・タイプを論理的に連結した値が、 特定の関数インスタンスを識別するのに使用されます。

data-type が修飾なしの場合は、SQL パス上でスキーマを検索してタイプ名が決定されます。

パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。 空の括弧をコーディングすることによって、 一致データ・タイプの検索時にそれらの属性を無視するように指定することができます。

FLOAT() は、パラメーター値によって異なるデータ・タイプ (REAL または DOUBLE) を表すので、使用できません (SQLSTATE 42601)。

長さ、精度、または位取りをコーディングする場合、 その値は、CREATE FUNCTION ステートメントで指定された値と完全に一致していなければなりません。 文字ストリングおよびグラフィック・ストリングのデータ・タイプに対して長さが指定されている場合、その長さ属性のストリング単位は、CREATE FUNCTION ステートメントで指定されたものと完全に一致していなければなりません。

0< n <25 は REAL を意味し、24< n <54 は DOUBLE を意味するので、FLOAT(n) のタイプは、n に定義された値と一致している必要はありません。マッチングは、タイプが REAL か DOUBLE かに基づいて行われます。

指定したスキーマまたは暗黙のスキーマに、指定したシグニチャーを持つ関数がない場合は、 エラー (SQLSTATE 42883) が戻されます。

その関数シグニチャーの関数が存在し、そのステートメントの許可 ID がこの関数に対する EXECUTE 特権を持っていない場合には、エラー (SQLSTATE 42501) が返されます。

SPECIFIC FUNCTION specific-name
関数の作成時に指定された名前、またはデフォルト値として与えられた名前を使用して、特定のユーザー定義関数を指定します。動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが、 修飾子のないオブジェクト名の修飾子として使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のないオブジェクト名の修飾子が暗黙指定されます。 specific-name (特定名) は、 指定したスキーマまたは暗黙のスキーマの特定関数のインスタンスを指定していなければなりません。 そうでない場合、エラー (SQLSTATE 42704) が戻されます。specific-name の関数が存在し、 ステートメントの許可 ID が関数に対して EXECUTE 特権を持っていない場合には、 エラー (SQLSTATE 42501) が出されます。

  • 特権: 関数の定義者には、関数に対する EXECUTE 特権が常に与えられます。 関数の定義者には、関数をドロップする権限も与えられます。 また、関数の定義者にすべてのコンポーネント・ルーチンに対する EXECUTE WITH GRANT OPTION がある場合、WITH GRANT OPTION も関数の定義者に与えられます。

  1. Java ルーチンを使用して、一連の数値の平均値を返す集約関数を定義します。
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
     
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DOUBLE, INOUT sum DOUBLE, INOUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_accumulate';
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DOUBLE, IN count INT, 
          INOUT mergesum DOUBLE, INOUT mergecount INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_merge';
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DOUBLE, count INT)
       RETURNS DECFLOAT(34)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_finalize';
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DECFLOAT(34)
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING 
       INITIALIZE PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
  2. 非修飾プロシージャー名および関数名で集約関数を定義します。 スキーマ FOO の下で集約関数を定義します。 スキーマ BAR の下で集約関数を呼び出します。
    SET SCHEMA FOO;
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
    
    SET SCHEMA BAR;
    
    SELECT FOO.myavg(c1) FROM t1;
    FOO.myavg の呼び出しで、データベース・マネージャーは、FOO.myavg_initializeFOO.myavg_accumulateFOO.myavg_merge という名前を持つプロシージャー、および FOO.myavg_finalize という名前を持つ関数を検索します。
  3. 特定の非修飾プロシージャー名および関数名で集約関数を定義します。 スキーマ FOO の下で集約関数を定義します。 スキーマ BAR の下で集約関数を呼び出します。
    SET SCHEMA FOO;
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize1
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate1
       MERGE SPECIFIC PROCEDURE myavg_merge1
       FINALIZE SPECIFIC FUNCTION myavg_finalize1;
    
    SET SCHEMA BAR;
    
    SELECT FOO.myavg(c1) FROM t1;
    FOO.myavg の呼び出しで、データベース・マネージャーは、FOO.myavg_initialize1FOO.myavg_accumulate1FOO.myavg_merge1 という特定名を持つプロシージャー、および FOO.myavg_finalize1 という特定名を持つ関数を検索します。
  4. いくつかのコンポーネント・ルーチンなしで集約関数を定義します。 集約関数は無効なものとして作成され、次回アクセスしたときに再有効化が呼び出されます。
    UPDATE DB CFG USING AUTO_REVAL DEFERRED_FORCE;
    
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
     
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DOUBLE, INOUT sum DOUBLE, INOUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_accumulate';
    
    -- component routine merge and finalize are missing, the creation is successful and myavg is invalid:
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE  PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DOUBLE, IN count INT, 
          INOUT mergesum DOUBLE, INOUT mergecount INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_merge';
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DOUBLE, count INT)
       RETURNS DOUBLE
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_finalize';
    
    -- revalidation of myavg will be invoked and it will be successful
    SELECT myavg(c1) FROM t1;
  5. グローバル変数をパラメーターのデフォルトとして使用して集約関数を定義します。 グローバル変数をドロップすると、関数は無効化されます。
    CREATE VARIABLE gv1 DOUBLE;
    
    -- create all 4 component routines (myavg_initialize, myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(p1 DOUBLE DEFAULT gv1)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- the following statement invalidates the function 'myavg'
    DROP VARIABLE gv1;
  6. コンポーネント・ルーチンがグローバル変数をパラメーターのデフォルトとして使用する集約関数を定義します。 グローバル変数をドロップすると、コンポーネント・ルーチンと集約関数の両方が無効化されます。
    CREATE VARIABLE gv1 INT;
    
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT DEFAULT gv1)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- create the remaining 3 component routines (myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- the following statement invalidates both the routine 'myavg_initialize' and the function 'myavg'
    DROP VARIABLE gv1;
  7. 集約関数を定義し、その後、その集約関数を呼び出すプロシージャーを作成します。 次に、コンポーネント・ルーチンの 1 つをドロップまたは置換します。 どちらのアクションも、集約関数およびそれを呼び出すプロシージャーの両方を無効化します。
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL 
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- create the remaining 3 component routines (myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    CREATE OR REPLACE PROCEDURE myproc (OUT p1 DOUBLE)
    BEGIN
       SET p1 = (SELECT myavg(c1) FROM t1);
    END;
    
    -- drop the component routine
    -- this action invalidates both the 'myavg' aggregation function and the 'myproc' procedure that calls it:
    DROP PROCEDURE myavg_initialize;
     
    -- re-create the component routine
    -- like the DROP statement, this action invalidates both the 'myavg' aggregation function and the 'myproc' procedure that calls it:
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE C PARAMETER STYLE C
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize_C_version';
    
    -- revaliation is invoked the next time 'myproc' is accessed
    -- both the 'myavg' aggregation function and the 'myproc' procedure are revalidated
    CALL myproc(?); 
  8. AUTO_REVAL データベース構成パラメーターを使用して、無効化および再有効化のセマンティクスを制御します。
    UPDATE DB CFG USING AUTO_REVAL DEFERRED_FORCE;
    
    -- global variable 'gv1' does not exist; the 'myavg_initialize' procedure can be created, but it is invalid
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT default gv1)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- create the remaining 3 component routines (myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    -- the 'myavg' function can be created, but it is invalid 
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS mydouble
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- create the global variable 'gv1'
    CREATE VARIABLE gv1 DOUBLE;
    
    -- revalidation of 'myavg' function and 'myavg_initialize' procedure is invoked; revalidation is successful
    SELECT myavg(c1) FROM t1;
    
    -- change the setting of the AUTO_REVAL database configuration parameter to IMMEDAITE
    UPDATE DB CFG USING AUTO_REVAL IMMEDIATE;
    
    -- the CREATE OR REPLACE VARIABLE statement invokes the revalidation for both 'myavg' function and 'myavg_initialize' procedure
    CREATE OR REPLACE VARIABLE gv1 DOUBLE DEFAULT 1.0;
  9. SQL ルーチンを使用して一連の数値の平均値を計算して戻す集約関数を作成します。
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DECFLOAT, OUT count INT)
    LANGUAGE SQL
    CONTAINS SQL
    BEGIN
    
      SET sum = 0;
      SET count = 0;
    
    END @
    
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DECFLOAT, INOUT sum DECFLOAT, INOUT count INT)
    LANGUAGE SQL
    CONTAINS SQL
    BEGIN
    
      SET sum = sum + input;
      SET count = count + 1;
    
    END @
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DECFLOAT, IN count INT,
    INOUT mergesum DECFLOAT, INOUT mergecount INT)
    LANGUAGE SQL
    CONTAINS SQL
    BEGIN
    
      SET mergesum = sum + mergesum;
      SET mergecount = count + mergecount;
    
    END @
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DECFLOAT, count INT)
    LANGUAGE SQL
    CONTAINS SQL
    RETURNS DECFLOAT(34)
    BEGIN
    
      RETURN (sum /  count);
    
    END @
    
    CREATE OR REPLACE FUNCTION myavg(DECFLOAT)
    RETURNS DECFLOAT(34)
    AGGREGATE WITH (sum DECFLOAT, count INT)
    USING
    INITIALIZE PROCEDURE myavg_initialize
    ACCUMULATE PROCEDURE myavg_accumulate
    MERGE PROCEDURE myavg_merge
    FINALIZE FUNCTION myavg_finalize
    @