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

CREATE FUNCTION (ソース派生またはテンプレート) ステートメントは、サーバーに関数または関数テンプレートを登録する場合に使用します。

このステートメントは、以下のオブジェクトを登録できます。
  • 他の既存のスカラー関数または集約関数に基づくユーザー定義関数 (現行サーバーに登録)。
  • 関数テンプレート (フェデレーテッド・サーバーとして指定されたアプリケーション・サーバーに登録)。 関数テンプレート とは、実行可能コードを含まない部分関数のことです。 ユーザーは、データ・ソース関数へマッピングする目的でこれを作成します。 マッピングを作成したら、フェデレーテッド・サーバーへサブミットする照会に、その関数テンプレートを指定できます。 そのような照会を処理する場合、フェデレーテッド・サーバーは、 テンプレートのマップ先のデータ・ソース関数を呼び出し、値を戻します。 この値のデータ・タイプは、テンプレートの定義の RETURNS 部分にある値に対応するものです。

呼び出し

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

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • データベースに対する IMPLICIT_SCHEMA 権限 (関数の暗黙または明示のスキーマ名が存在しない場合)
  • スキーマに対する CREATEIN 特権 (関数のスキーマ名が存在する場合)
  • スキーマに対する SCHEMAADM 権限 (関数のスキーマ名が存在する場合)
  • DBADM 権限

このステートメントの許可 ID に DATAACCESS 権限がなく、さらにソース関数が含まれるスキーマに対する DATAACCESS 権限もなく、かつ SOURCE 節が指定されている場合、ステートメントの許可 ID が持つ特権には、ソース関数に対する EXECUTE 特権またはソース関数が含まれるスキーマに対する EXECUTEIN 特権も含まれている必要があります。

グループ特権は、CREATE FUNCTION ステートメントで指定された表やビューに対しては考慮されません。

構文

構文図を読む構文図をスキップするCREATE FUNCTIONfunction-name( ,parameter-declaration )RETURNSdata-type2SPECIFIC specific-nameSOURCEfunction-nameSPECIFICspecific-namefunction-name(,data-type)PARAMETER CCSIDASCIIUNICODEAS TEMPLATENOT DETERMINISTICDETERMINISTICEXTERNAL ACTIONNO EXTERNAL ACTION
parameter-declaration
構文図を読む構文図をスキップする parameter-name data-type1 default-clause
data-type1、data-type2
構文図を読む構文図をスキップするbuilt-in-typedistinct-type-namestructured-type-name
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)
注:
  • 1 FOR BIT DATA 節とその後に続く他の列制約とは、任意の順序で指定できます。FOR BIT DATA 節をストリング単位の CODEUNITS32 とともに指定することはできません (SQLSTATE 42613)。
  • 2 Db2SECURITYLABEL は、保護対象表の行セキュリティー・ラベル列を定義するために使用しなければならない組み込み特殊タイプです。
  • 3 タイプ Db2SECURITYLABEL の列の場合、NOT NULL WITH DEFAULT は暗黙指定になるので、明示的に指定することはできません (SQLSTATE 42842)。タイプ Db2SECURITYLABEL の列のデフォルト値は、セッション許可 ID の書き込みアクセスのためのセキュリティー・ラベルです。

説明

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 および比較演算子です。

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

(parameter-declaration,...)
関数または関数テンプレートの入力パラメーターの数を指定するとともに、各パラメーターのデータ・タイプとデフォルト値 (オプション) を指定します。 このリストには、関数または関数テンプレートが受け取ることを予期している各パラメーターごとに、 1 つの項目を指定する必要があります。 パラメーターの数は 90 を超えることはできません (SQLSTATE 54023)。
パラメーターのない関数も登録可能です。 この場合、指定するデータ・タイプがない場合でも、括弧はコーディングする必要があります。 以下に例を示します。
   CREATE FUNCTION WOOFER() ...

対応するすべてのパラメーターで、1 つのスキーマ内で名前が同じ 2 つの関数が、まったく同じタイプを持つことはできません。 この制限は、同じ名前を持つ同じスキーマ内の関数および関数テンプレートにも適用されます。 このタイプの比較では長さ、精度、および位取りは考慮されません。 したがって、CHAR(8) と CHAR(35)、また DECIMAL(11,2) と DECIMAL (4,3) は、 それぞれ同じタイプと見なされます。 緩やかに型付けされた特殊タイプをパラメーターに指定した場合、その特殊タイプは、特殊タイプのソース・タイプと同じデータ・タイプと見なされます。 Unicode データベースの場合には、CHAR(13) と GRAPHIC(8) は、それぞれ同じタイプと見なされます。 さらに、DECIMAL と NUMERIC などのように、 この目的で複数のタイプが同じタイプとして扱われることがあります。 シグニチャーが重複していると、エラー (SQLSTATE 42723) を戻します。

parameter-name
入力パラメーターにオプションの名前を指定します。この名前は、パラメーター・リスト内の他のすべての parameter-name と同じにすることはできません (SQLSTATE 42734)。
data-type1
入力パラメーターのデータ・タイプを指定します。 データ・タイプは、組み込みデータ・タイプ、特殊タイプ、または構造化タイプにすることができます。

SOURCE 節で指定された関数の対応するパラメーターのタイプにキャスト可能な場合は、 任意の有効な SQL データ・タイプを使用できます (詳細は「データ・タイプ間のキャスト」を参照)。 ただし、この検査によって関数の呼び出し時にエラーが発生しないことが保証されるわけではありません。

各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。

  • 日時タイプのパラメーターは文字データ・タイプとして受け渡され、そのデータは ISO 形式で受け渡されます。
  • 配列タイプを指定することはできません (SQLSTATE 42879)。
  • REF(type-name) で指定された参照タイプを指定することはできません (SQLSTATE 42879)。

ユーザー定義特殊タイプの場合、パラメーターの長さ、精度、または桁数の属性は、特殊タイプのソース・タイプのもの (CREATE TYPE で指定されたもの) になります。 特殊タイプのパラメーターは、特殊タイプのソース・タイプとして受け渡されます。 特殊タイプの名前が修飾されていない場合は、データベース・マネージャーによって SQL パス内のスキーマが検索され、スキーマ名が解決されます。

ユーザー定義構造化タイプの場合、適切なトランスフォーム関数が関連するトランスフォーム・グループに存在する必要があります。

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

関数テンプレートを使用すると、パラメーター化データ・タイプに長さ、精度、 または位取りを指定する代わりに、空の括弧も使用できます。 パラメーター化データ・タイプには空の括弧を使用することが推奨されています。 空の括弧を使用する場合、長さ、精度、または位取りはリモート関数のものと同じです。 それらは関数マッピング作成時に関数テンプレートがリモート関数にマップされるときに決定されます。 括弧をすべて省略した場合は、 データ・タイプのデフォルト長が使用されます (「CREATE TABLE」を参照)。

DEFAULT
パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。デフォルトとして指定できる特殊レジスターは、 列のデフォルトに指定できる特殊レジスターと同じです (CREATE TABLE ステートメントの default-clause を参照)。 他の特殊レジスターは、式を使用することによってデフォルトとして指定できます。

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

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

デフォルトは ARRAY、ROW、または CURSOR タイプのパラメーターには指定できません (SQLSTATE 429BB)。

RETURNS
この節は必須で、関数または関数テンプレートの出力を指定します。
data-type2
出力のデータ・タイプを指定します。

ソース・スカラー関数では、 ソース関数の結果のタイプからキャスト可能であれば、 任意の有効な SQL データ・タイプ (特殊タイプも同様) を指定できます。 配列タイプをパラメーターのデータ・タイプとして指定することはできません (SQLSTATE 42879)。

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

関数が他の関数に基づいている場合に RETURNS 節のデータ・タイプの指定に適用される考慮事項と規則については、 このステートメントの『規則』セクションを参照してください。

関数テンプレートを使用する場合は、空の括弧を使用できません (SQLSTATE 42611)。 パラメーター化データ・タイプには、長さ、精度、または位取りを指定する必要があります。 リモート関数と同じ長さ、精度、または位取りを指定することが推奨されています。

built-in-type
組み込みデータ・タイプの説明については、『CREATE TABLE』を参照してください。
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)。

SOURCE
新しい関数がソース派生関数として定義されることを指定します。ソース派生関数 は、別の関数 (ソース関数) によってインプリメントされます。この関数は現行のサーバーに存在するスカラーまたは集約関数でなければならず、また以下のいずれかのタイプの関数でなければなりません。
  • CREATE FUNCTION ステートメントを使用して定義された関数
  • CREATE TYPE ステートメントによって生成された cast 関数
  • 組み込み関数
ソース関数が組み込み関数でない場合、特定の関数はその名前、関数シグニチャー、または特定の名前によって識別できます。
ソース関数が組み込み関数の場合、SOURCE 節にその組み込み関数の関数シグニチャーが組み込まれていなければなりません。ソース関数を、以下の組み込み関数のいずれかにすることはできません (特定の構文が示されている場合、示されている書式のみ指定できません)。 :
  • CARDINALITY
  • 複数のパラメーターが指定され、最初のパラメーターが日時データ・タイプである CHAR
  • ストリング単位パラメーター付きの CHARACTER_LENGTH
  • COALESCE
  • CONTAINS
  • CURSOR_ROWCOUNT
  • DATAPARTITIONNUM
  • DBPARTITIONNUM
  • DEREF
  • EXTRACT
  • 複数のパラメーターが指定され、最初のパラメーターが日時データ・タイプである GRAPHIC
  • GREATEST
  • HASHEDVALUE
  • ストリング単位パラメーター付きの INSERT
  • ストリング単位パラメーター付きの INSTR
  • ストリング単位パラメーター付きの LCASE
  • LEAST
  • ストリング単位パラメーター付きの LEFT
  • ストリング単位パラメーター付きの LENGTH
  • ストリング単位パラメーター付きの LOCATE
  • ストリング単位パラメーター付きの LOCATE_IN_STRING
  • ストリング単位パラメーター付きの LOWER
  • MAX
  • MAX_CARDINALITY
  • MIN
  • NODENUMBER
  • NULLIF
  • NVL
  • ストリング単位パラメーター付きの OVERLAY
  • PARAMETER
  • ストリング単位パラメーター付きの POSITION
  • RAISE_ERROR
  • REC2XML
  • RID
  • RID_BIT
  • ストリング単位パラメーター付きの RIGHT
  • SCORE
  • STRIP
  • ストリング単位パラメーター付きの SUBSTRING
  • TRIM
  • TRIM_ARRAY
  • TYPE_ID
  • TYPE_NAME
  • TYPE_SCHEMA
  • ストリング単位パラメーター付きの UCASE
  • ストリング単位パラメーター付きの UPPER
  • VALUE
  • 複数のパラメーターが指定され、最初のパラメーターが日時データ・タイプである VARCHAR
  • 複数のパラメーターが指定され、最初のパラメーターが日時データ・タイプである VARGRAPHIC
  • XMLATTRIBUTES
  • XMLCOMMENT
  • XMLCONCAT
  • XMLDOCUMENT
  • XMLELEMENT
  • XMLFOREST
  • XMLNAMESPACES
  • XMLPARSE
  • XMLPI
  • XMLQUERY
  • XMLROW
  • XMLSERIALIZE
  • XMLTEXT
  • XMLVALIDATE
  • XMLXSROBJECTID
  • XSLTRANSFORM
function-name

ソースとして使用する関数を示します。この名前がスキーマ内で固有であり、許可 ID にスキーマに対する DATAACCESS 権限、スキーマに対する EXECUTEIN 特権、または関数に対する EXECUTE 特権がある場合にのみ有効です。 この構文変形は、組み込み関数であるソース関数に対しては無効です。

修飾されていない名前を指定した場合、関数を見つけるために SQL パスが使用されます。 これは CURRENT PATH 特殊レジスターの値です。 この関数名を持ち、許可 ID にスキーマに対する DATAACCESS 権限、スキーマに対する EXECUTEIN 特権、または関数に対する EXECUTE 特権があるスキーマのうち、SQL パスの中で最初に出現するものが選択されます。

以下のそれぞれのケースで、データベースはエラー SQLSTATE 42704 を返します。
  • 指定したスキーマにこの名前の関数が存在しない
  • 名前が有効ではない
  • SQL パスの中にこの名前の関数が存在しない

指定したスキーマまたは見つかったスキーマに、この関数の許可インスタンスが複数個ある場合、データベースはエラー SQLSTATE 42725 を返します。

この名前の関数が存在しても、ステートメントの許可 ID に、関数のスキーマに対する EXECUTE 特権、EXECUTEIN 特権、または DATAACCESS 権限がない場合、データベースはエラー SQLSTATE 42501 を返します。

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

非修飾名を指定すると、 現行 SQL パスがその関数を見つけるのに使用されます。 このステートメントの許可 ID がこの関数に関して EXECUTE 特権または EXECUTEIN 特権を持つかそのスキーマに対する DATAACCESS 権限を持つ場合、この特定の名前の関数が含まれるスキーマのうち、SQL パスの中で最初に出現するものが選択されます。

指定されたスキーマにこの specific-name の関数が見つからないか、 あるいは名前が修飾されておらず、 この specific-name の関数が SQL パスにない場合は、エラー (SQLSTATE 42704) が戻されます。 その specific-name という名前の関数が存在し、そのステートメントの許可 ID がこの関数に対する EXECUTE 特権も、EXECUTEIN 特権も、スキーマに対するスキーマ DATAACCESS 権限も持っていない場合には、エラー (SQLSTATE 42501) が返されます。

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) が戻されます。

PARAMETER CCSID
関数とやり取りされるすべてのストリング・データに使用されるコード化スキームを指定します。 PARAMETER CCSID 節を指定しない場合のデフォルトは、 Unicode データベースでは PARAMETER CCSID UNICODE、 他のすべてのデータベースでは PARAMETER CCSID ASCII になります。
ASCII
ストリング・データがデータベース・コード・ページでエンコードされることを指定します。 データベースが Unicode データベースの場合は、 PARAMETER CCSID ASCII を指定することはできません (SQLSTATE 56031)。 関数が呼び出されるときのアプリケーション・コード・ページはデータベース・コード・ページです。
UNICODE
ストリング・データが Unicode でエンコードされることを指定します。 データベースが Unicode データベースの場合、文字データは UTF-8、 GRAPHIC データは UCS-2 になります。 データベースが Unicode データベースでない場合は、文字データは UTF-8 になります。 いずれの場合も、関数が呼び出されるときのアプリケーション・コード・ページは 1208 です。

PARAMETER CCSID 節には、ソース関数と同じコード化スキームを指定することが必要です (SQLSTATE 53090)。

AS TEMPLATE
このステートメントが、実行可能コードを含む関数ではなく、 関数テンプレートを作成するために使われることを示しています。
NOT DETERMINISTIC または DETERMINISTIC
関数が同一の入力引数に同じ結果を戻すかどうかを指定します。 デフォルトは NOT DETERMINISTIC です。
NOT DETERMINISTIC
同じ入力引数を指定して呼び出しても、関数が同じ結果を戻さない場合があることを指定します。 関数は、結果に影響する状態値によって左右されます。 データベース・マネージャーは、SQL ステートメントの最適化中に、この情報を使用します。 deterministic ではない (常には同じ結果が戻されない) 関数の例としては、 乱数を生成する関数があります。

deterministic ではない関数は、並列タスクによって実行されると、不正確な結果を受け取る場合があります。

DETERMINISTIC
同じ入力引数を指定して呼び出すと、関数から常に同じ結果が戻されることを指定します。 データベース・マネージャーは、SQL ステートメントの最適化中に、この情報を使用します。 deterministic な (常に同じ結果を戻す) 関数の例としては、入力引数の平方根を計算する関数があります。
EXTERNAL ACTION または NO EXTERNAL ACTION
関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を 変更するアクションを取るかどうかを指定します。 外部アクションの例としては、メッセージの送信やファイルへのレコードの書き込みがあります。 デフォルトは EXTERNAL ACTION です。
EXTERNAL ACTION
関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を変更するアクションを取ることを指定します。 SQL ルーチン本体が EXTERNAL ACTION を指定して定義されている関数を呼び出す場合は、 EXTERNAL ACTION を暗黙的または明示的に指定することが必要です (SQLSTATE 428C2)。

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

NO EXTERNAL ACTION
関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を 変更するアクションを取らないことを指定します。 データベース・マネージャーは、SQL ステートメントの最適化中に、この情報を使用します。

規則

  • 便宜上、この項では作成する関数を CF と呼び、 SOURCE 節で指定する関数を SF と呼びます (許される 3 つの構文の どれが SF の指定に使用されたかは関係ありません)。
    • CF と SF のそれぞれの非修飾名が異なる名前であっても構いません。
    • 他の関数のソースとして指定された関数自体が、別の関数をソースとして使用した関数であっても構いません。 間接的に呼び出された関数がエラーを戻すと、 アプリケーションをデバッグすることが極めて難しくなるので、 この機能を使用する場合には細心の注意を払う必要があります。
    • 以下の節は、SOURCE 節と共に指定した場合 には無効になります (CF はこれらの属性を SF から継承するからです)。
      • CAST FROM ...
      • EXTERNAL ...
      • LANGUAGE ...
      • PARAMETER STYLE ...
      • DETERMINISTIC / NOT DETERMINISTIC
      • FENCED / NOT FENCED
      • RETURNS NULL ON NULL INPUT / CALLED ON NULL INPUT
      • EXTERNAL ACTION / NO EXTERNAL ACTION
      • NO SQL / CONTAINS SQL / READS SQL DATA
      • SCRATCHPAD / NO SCRATCHPAD
      • FINAL CALL / NO FINAL CALL
      • RETURNS TABLE (...)
      • CARDINALITY ...
      • ALLOW PARALLEL / DISALLOW PARALLEL
      • DBINFO / NO DBINFO
      • THREADSAFE / NOT THREADSAFE
      • INHERIT SPECIAL REGISTERS

    これらの規則に違反すると、エラー (SQLSTATE 42613) になります。

  • CF の入力パラメーターの数は、SF のパラメーターの数と同じでなければなりません。 異なる場合には、エラー (SQLSTATE 42624) が戻されます。
  • 次の場合には、CF にパラメーター化データ・タイプの長さ、 精度、または位取りを指定する必要がありません。
    • 関数の入力パラメーター
    • その RETURNS パラメーター

    代わりに、VARCHAR() のように、データ・タイプの一部として空の括弧を使用することにより、 長さ、精度、および位取りがソース関数と同じであるか、 あるいはキャストによって決定されるように指定することができます。

    ただし、長さ、精度、または位取りを指定した場合には、CF における値と SF の対応する値とが比較検査されます。 これについては、以下の入力パラメーターおよび戻り値の規則に関する説明中に概要を示します。

  • CF の入力パラメーターの指定は、SF の入力パラメーターの指定と比較検査されます。 CF の各パラメーターのデータ・タイプは、 SF の対応するパラメーターのデータ・タイプと同じであるか、 あるいはキャスト可能 でなければなりません。 同じタイプでないか、あるいはキャスト可能ではないパラメーターがある場合には、 エラー (SQLSTATE 42879) が戻されます。

    この規則は、CF の使用時に発生し得るエラーに対して何らかの保証を与えるものではありません。 CF パラメーターのデータ・タイプや長さ、または精度属性に一致する引数は、 対応する SF パラメーターの方が長さが短かったり精度が劣る場合には、 割り当てることができません。 一般に、CF のパラメーターの長さ属性や精度属性は、 対応する SF パラメーターのそれよりも大きくしてはなりません。

  • CF の RETURNS データ・タイプの指定は、SF のそれと比較検査されます。 キャスト後の SF の最終の RETURNS データ・タイプは、 CF の RETURNS のデータ・タイプと同じか、あるいはそれにキャスト可能でなければなりません。 そうでない場合、エラー (SQLSTATE 42866) が戻されます。

    この規則は、CF の使用時に発生し得るエラーに対して何らかの保証を与えるものではありません。 SF の RETURNS データ・タイプのデータ・タイプや長さもしくは精度属性に一致する結果の値は、 CF の RETURNS データ・タイプの方が長さが短かったり精度が劣る場合には、 割り当てることができません。 長さもしくは精度属性が SF の RETURNS データ・タイプのそれよりも 小さい CF の RETURNS データ・タイプを指定することにした場合は、十分に注意を払ってください。

  • デフォルトの式を持つパラメーターがない CF の再妥当性検査は、サポートされません (SQLSTATE 42997)。

  • あるデータ・タイプが他のデータ・タイプにキャスト可能かどうかの判別では、 CHAR や DECIMAL などのパラメーター化データ・タイプの長さまたは精度と位取りは考慮されません。 したがって、ソース・データ・タイプの値をターゲット・データ・タイプの値にキャストしようとすると、 関数の使用時にエラーになる可能性があります。 例えば、VARCHAR は DATE にキャストできますが、 実際にはソース・タイプが VARCHAR(5) と定義されている場合には、 関数の使用時にエラーになります。
  • ユーザー定義関数のパラメーターのデータ・タイプを選択する場合は、 入力値に影響を与えるプロモーションの規則を考慮してください (『データ・タイプのプロモーション』を参照してください)。 例えば、入力値として使用できる定数のデータ・タイプは、 予期される以外の組み込みデータ・タイプである可能性があり、さらには、 予期されるデータ・タイプにプロモートできない場合があります。 プロモーションの規則に従って、 一般にパラメーターには次のデータ・タイプを使用するようにしてください。
    • SMALLINT ではなく INTEGER
    • REAL ではなく DOUBLE
    • CHAR ではなく VARCHAR
    • GRAPHIC ではなく VARGRAPHIC
  • まだ存在していないスキーマ名を用いて関数を作成すると、 ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、 そのスキーマが暗黙に作成されます。 スキーマの所有者は SYSIBM になります。スキーマに対する CREATEIN 特権が PUBLIC に付与されます。
  • データ・ソース関数を認識するフェデレーテッド・サーバーの場合、 この関数はフェデレーテッド・データベースにあるもう一方の関数にマップする必要があります。 データベースに対となる関数がない場合、 ユーザーがそれを作成してマッピングしなければなりません。

    対となるもう一方は、関数 (スカラーまたはソース) か、関数テンプレートとすることができます。 ユーザーが関数を作成して必要なマッピングを行うと、 その関数を指定する照会を処理するたびに、データベース・マネージャーは、 (1) その関数を呼び出すときの戦略と、データ・ソース関数を呼び出すときの戦略を比べ、 (2) オーバーヘッドが少ないと思われる関数を呼び出します。

    ユーザーが関数テンプレートとマッピングを作成すると、 そのテンプレートを指定する照会を処理するたびに、データベース・マネージャーは、 マッピング先のデータ・ソース関数を呼び出します (ただし、 この関数を呼び出すためのアクセス・プランが存在する場合)。

  • 特権: 関数の定義者は、関数に対する EXECUTE 特権と、関数をドロップする権利を常に与えられます。 以下のいずれかの条件が当てはまる場合には、関数の定義者に WITH GRANT OPTION も与えられます。
    • ソース関数が、組み込み関数である。
    • 関数の定義者が、ソース関数に対して WITH GRANT OPTION 付きの EXECUTE 特権を持っている。
    • 関数の定義者が、ソース関数が含まれるスキーマに対して EXECUTEIN WITH GRANT OPTION を持っている。
    • 関数が、テンプレートである。
  • EXTERNAL ACTION 関数: EXTERNAL ACTION 関数が最外部の選択リスト以外で呼び出された場合、関数が呼び出される回数は使用されるアクセス・プランによって異なるため、結果が予測不能になります。
  • デフォルト値の設定: デフォルト値で定義された関数のパラメーターは、この関数の呼び出し時に、それらのデフォルト値に設定されますが、この関数の呼び出し時に、値が対応する引数に提供されていないか、または DEFAULT で指定されている場合にのみ、このように設定されます。
  • 表関数または行関数に対する関数マッピングの作成: 表または行を戻すリモート関数への関数マッピングの作成は、フェデレーテッド・データベースではサポートされていません。
  • ソース関数からの SECURED 属性または NOT SECURED 属性の継承: ソース派生ユーザー定義関数は、最上位のユーザー定義関数のみが考慮されるソース関数から SECURED 属性または NOT SECURED 属性を継承します。 最上位のユーザー定義関数がセキュアである場合、ネストしたユーザー定義関数はすべてセキュアであると見なされます。データベース・マネージャーは、それらのネストしたユーザー定義関数がセキュアであるかどうかを妥当性検査しません。 それらのネストした関数が機密データにアクセスできる場合、SECADM 権限のあるユーザーは、それらの関数が機密データへのアクセスを許可されていることと、それらの関数へのすべての変更に変更制御監査プロシージャーが確立されていることを確認する必要があります。

  • 例 1: Pellow がオリジナルの CENTRE 外部スカラー関数を作成した後に、 別のユーザーがその関数に基づいて関数を作成します。 この関数は、整数引数のみを受け入れるという点だけが異なります。
       CREATE FUNCTION MYCENTRE (INTEGER, INTEGER)
         RETURNS FLOAT
         SOURCE PELLOW.CENTRE (INTEGER, FLOAT)
  • 例 2: 組み込みの INTEGER データ・タイプに基づく特殊タイプ HATSIZE が作成済みです。それぞれの部門の平均の hat size を計算するには、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 DETERMINISTIC NO EXTERNAL ACTION
  • 例 4: フェデレーテッド・システムで、 特定の組織の従業員に対して支給されるボーナスの総額 (ドル) を戻す Oracle UDF を呼び出します。 フェデレーテッド・サーバーは、この関数とフェデレーテッド・データベース側の対となる関数との間でマッピングが行われる場合にだけ、 この関数を認識することができます。 ところがそのような対となる関数は存在しないため、ユーザーが関数テンプレートの形で作成します。 次のコードを使用して、このテンプレートをフェデレーテッド・サーバーに登録します。
       CREATE FUNCTION BONUS ()
         RETURNS DECIMAL (8,2)
         AS TEMPLATE DETERMINISTIC NO EXTERNAL ACTION