CREATE FUNCTION 文(外部テーブル関数)

この CREATE FUNCTION ステートメントは、ユーザー定義外部表関数を データベース・サーバーに登録します。 ユーザー定義の外部表関数は、副選択の FROM 文節で使用できます。 この関数は、呼び出されるたびに一度に 1 行を戻すことにより、副選択に対して表を戻します。

CREATE FUNCTION(外部テーブル)の呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 これは、DYNAMICRULES RUN動作が有効になっている場合にのみ、動的に準備できる実行可能なステートメントです。 詳細は、「Authorization IDs and dynamic SQL」 を参照してください。

CREATE FUNCTION(外部テーブル)の権限

以下に定義する特権セットには、少なくとも次のいずれかが含まれていなければなりません。

  • スキーマに対する CREATEIN 特権
  • SYSADM または SYSCTRL 権限
  • システム DBADM
  • 変更の開始インストール SYSOPR 権限 (プロセスの現行 SQLID が SYSINSTL に設定されている場合)変更の終わり

スキーマ名と一致する許可 ID には、暗黙的にそのスキーマの CREATEIN 特権があります。

変更の開始関数の作成に使用される許可 ID にインストール SYSADM 権限またはインストール SYSOPR 権限があり、現行の SQLID が SYSINSTL に設定されている場合、関数はシステム定義関数として識別されます。変更の終わり

関数が表をパラメーターとして使用する場合、 特殊タイプを参照する場合、または関数を WLM (ワークロード・マネージャー) 環境で実行する場合には、追加特権が必要です。 必要になる特権は、次のとおりです。

  • 関数の入力パラメーターである任意の表の SELECT 特権。
  • 関数が参照する各特殊タイプの USAGE 特権。
  • 指定された WLM 環境でプログラムを作成する権限。 この認証は、 RACF® などの外部セキュリティ製品から取得されます。

SECURED オプションを指定する場合は、以下の追加特権の少なくとも 1 つが必要です。

  • SECADM 権限
  • CREATE_SECURE_OBJECT 特権

特権セット:

アプリケーション・プログラムにこの ステートメントを組み込む場合、特権セットは、プランまたはパッケージの所有者が持つ特権となります。 所有者がロールである場合、暗黙的なスキーマの一致は適用されず、また、このロールは上にリストした条件のうちのいずれかを満たしていなければなりません。

このステートメントが動的に準備され、かつ、ROLE AS OBJECT OWNER 文節が指定されたトラステッド・コンテキストの中で実行されていない場合、この特権セットは、プロセスの SQL 許可 ID が持つ特権のセットとなります。 スキーマ名がプロセスの SQL 許可 ID と異なる場合、下記の条件のいずれか 1 つが満たされていなければなりません。

  • 特権セットに SYSADM または SYSCTRL 権限が含まれている。
  • プロセスの SQL 許可 ID に、スキーマの CREATEIN 特権がある。

CREATE FUNCTION(外部テーブル)の構文

構文図を読むビジュアルシンタックスダイアグラムをスキップするCREATE FUNCTIONfunction-name( ,parameter-declaration ) RETURNS TABLE(,カラム名Data-typeAS LOCATOR1)GENERIC TABLE2 option-list
注:
  • 1 AS LOCATOR は、LOB データ型または LOB データ型に基づく独自データ型に対してのみ指定できます。
  • 2 この条項およびオプションリストの続く条項は、任意の順序で指定することができます。

parameter-declaration:

構文図を読むビジュアルシンタックスダイアグラムをスキップするparameter-nameparameter-type

parameter-type:

構文図を読むビジュアルシンタックスダイアグラムをスキップするData-typeAS LOCATOR1TABLE LIKEtable-nameview-nameAS LOCATOR
注:
  • 1 AS LOCATOR は、LOB データ型または LOB データ型に基づく独自データ型に対してのみ指定できます。

データ・タイプ:

構文図を読むビジュアルシンタックスダイアグラムをスキップするbuilt-in-typedistinct-type-name

built-in-type:

構文図を読むビジュアルシンタックスダイアグラムをスキップするSMALLINTINTEGERINTBIGINTDECIMALDECNUMERIC(5,0)( 整数整数)FLOAT(53)( 整数)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( 整数)CHARACTERCHARVARYINGVARCHAR( 整数)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDBITDATACHARACTERCHARLARGE OBJECTCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDDATAGRAPHIC(1)( 整数)VARGRAPHIC(整数)DBCLOB(1M)( 整数KMG)CCSIDASCIIEBCDICUNICODEBINARY(1)( 整数)BINARY VARYINGVARBINARY( 整数)BINARY LARGE OBJECTBLOB(1M)( 整数KMG)DATETIMETIMESTAMP(6)(整数)WITHOUT TIME ZONEWITH TIME ZONEROWID

option-list: (option-list 内の 文節は、どのような順番で指定してもかまいません。)

構文図を読むビジュアルシンタックスダイアグラムをスキップするSPECIFICspecific-namePARAMETER1CCSIDASCIIEBCDICUNICODEVARCHARNULTERMSTRUCTUREEXTERNAL NAMEストリングID LANGUAGE ASSEMBLECCOBOLPLI PARAMETER STYLE SQLNOT DETERMINISTICDETERMINISTICFENCEDRETURNS NULL ON NULL INPUTCALLED ON NULL INPUTREADS SQL DATACONTAINS SQLNO SQLEXTERNAL ACTIONNO EXTERNAL ACTIONNO PACKAGE PATHPACKAGE PATHパッケージパスNO SCRATCHPADSCRATCHPAD100長さNO FINAL CALLFINAL CALLDISALLOW PARALLELNO DBINFODBINFOCARDINALITY整数NO COLLIDCOLLIDcollection-idWLM ENVIRONMENT名前( 名前)ASUTIME NO LIMITASUTIMELIMIT整数STAY RESIDENT NOSTAY RESIDENT YESPROGRAM TYPE SUBPROGRAM TYPE MAINSECURITY DB2SECURITYUSERDEFINERRUN OPTIONS実行時オプションINHERIT SPECIAL REGISTERSDEFAULT SPECIAL REGISTERSSTATIC DISPATCHSTOP AFTER SYSTEM DEFAULT FAILURESSTOP AFTER整数FAILURESCONTINUE AFTER FAILURENOT SECUREDSECURED
注:
  • 1 同一の条項は、複数回指定してはならない。

CREATE FUNCTION (外部テーブル) の説明

関数名
ユーザー定義関数の名前を指定します。 この名前は、スキーマ名によって暗黙的または明示的に 修飾されます。 詳細については、 「CREATE FUNCTION ステートメント (概要)」「スキーマ名と関数名の選択」 および 「スキーマ内の関数の一意性の決定」を参照してください。
(パラメータ宣言、…)
関数の入力パラメーターの数を指定し、各パラメーターのデータ・タイプを 指定します。 関数のパラメーターはすべて入力パラメーターで、NULL 可能です。 関数が受け取ると予期しているパラメーターには、それぞれリスト内に 1 個の項目 が必要です。 必須ではありませんが、 それぞれのパラメーターに名前を付けることができます。
パラメーターのない関数もあります。 この場合は、例えば次のように、空の 括弧の組をコーディングする必要があります。
    CREATE FUNCTION WOOFER()
パラメーター名
入力パラメーターの名前を指定します。 この名前は SQL ID で、 パラメーター・リスト内のそれぞれの名前は他のどの名前とも同じであってはなりません。 パラメーター名と列名に同じ名前を使用することはできません。
データ・タイプ
入力パラメーターのデータ・タイプを指定します。 データ型は、組み込みのデータ型でも、ユーザー定義の別個のデータ型でもよい。
一体型
入力パラメーターのデータ・タイプは組み込みデータ・タイプです。 組み込みデータ型の説明については、 CREATE TABLE文の built-in-typeデータ型と説明を参照してください。

文字データ・タイプまたはグラフィック・データ・タイプのパラメーターの場合は、PARAMETER CCSID 文節または CCSID 文節によってパラメーターのコード化スキームを指定します。 これらの文節をいずれも指定しない場合、コード化スキームはインストール・パネル DSNTIPF の DEF ENCODING SCHEME フィールドの値です。

型名明確
入力パラメーターのデータ・タイプは特殊タイプです。 パラメーターの長さ、 精度、位取り、サブタイプ、またはコード化スキームの各属性は、いずれも特殊タイプのソース・タイプの属性です。

スキーマ名を指定せずに特殊タイプの名前を指定する場合、Db2は SQL パス内のスキーマを検索することによってスキーマ名を解決します。

文字データ・タイプのパラメーターにはサブタイプ (BIT、SBCS、または MIXED) が 暗黙的または明示的に指定されていますが、関数プログラムは任意のサブタイプの 文字データを受け取ることができます。 したがって、関数が呼び出されると、入力データからパラメーターのサブタイプへの変換が起こる場合があります。 実際に DBCS 文字を含む混合データを SBCS サブタイプで宣言されている入力パラメーターの値に使用すると、エラーが起こります。

日時データ・タイプまたは特殊タイプのパラメーターは、異なるデータ・タイプとして 関数に渡されます。

  • 日時タイプ・パラメーターは文字データ・タイプとして渡され、データは ISO 形式 で渡されます。

    日時タイプ・パラメーターのコード化スキームは、任意の文字ストリングまたはグラフィック・ストリング・パラメーターの暗黙的または明示的に指定されたコード化スキームと同じです。 文字またはグラフィック・ストリング・パラメーターが渡されない場合、コード化スキームは、 インストール・パネル DSNTIPF の DEF ENCODING SCHEME フィールドの値になります。

  • 特殊タイプのパラメーターは、特殊タイプのソース・タイプとして受け渡されます。
AS LOCATOR
実際の値の代わりにパラメーターの値へのロケーターを関数に受け渡すことを指定します。 AS LOCATOR は、LOB データ・タイプ、または LOB データ・タイプに基づく特殊タイプのパラメーターの場合にのみ指定できます。 値の代わりにロケーターを受け渡すと、関数に受け渡されるバイト数を特にパラメーターの値が非常に大きい場合に少なくできます。

AS LOCATOR 節は、データ・タイプをプロモート可能かどうかの判別に効果はなく、また関数解決で使用される関数シグニチャーにも影響を与えません。

テーブル名 または ビュー名 AS 位置指定子
パラメーターが遷移表であることを指定します。 ただし、 関数が呼び出されるときには、遷移表の実際の値は関数に渡されません。 代わり に 1 つの値が渡されます。 この 1 つの値は表のロケーターで、 関数はこれを使用して遷移表の列にアクセスします。 表パラメーターを 使用する関数は、トリガーのトリガー・アクションだけから呼び出すことができます。

TABLE LIKE を使用すると、遷移表の暗黙の定義が行われます。 これは、遷移表が指定された表またはビューと同じ数の列を持つことを指定します。 表が指定された場合、その表で暗黙的に非表示と定義された列が遷移表に含まれます。 この列に関するデータ・タイプや、長さ、精度、位取り、サブタイプ、およびコード化スキームは、これらがカタログ表 SYSCOLUMNS と SYSTABLESPACE に記述される場合と同様に、指定される表またはビューと同じです。 これらの列の列数と属性は、CREATE FUNCTION ステートメントが処理される時点で決定されます。 表の列数とこれらの列の属性を後で変更しても、関数のパラメーターに影響は及びません。

table-name または view-name は、現行サーバーに存在する表またはビューを示すものでなければなりません。 ビューに長さが 0 の列を含めることはできません。 この名前に、宣言済み一時表を指定してはいけません。 指定された表には XML 列を含めることができますが、関数がこれらの XML 列を参照することはできません。 この名前は、トリガーの遷移表に関連する表と同じ名前である必要はありません。 非修飾の表またはビュー名は、以下の規則に従って暗黙的に修飾されます。

  • CREATE FUNCTION ステートメントがプログラムに組み込まれている場合、 暗黙的修飾子は、プランまたはパッケージの作成時または最終再バインド時 の QUALIFIER バインド・オプションの許可 ID です。 QUALIFIER を使用しなかった 場合、暗黙的修飾子はプランまたはパッケージ所有者になります。
  • CREATE FUNCTION ステートメントが動的に準備される場合には、 暗黙的修飾子は CURRENT SCHEMA 特殊レジスターの SQL 許可 ID となります。

関数が呼び出されるとき、表ロケーターで識別される遷移表と TABLE LIKE 文節で識別 される表またはビューの対応する列に含まれる定義は、同じでなければなりません。 これらの列のデータ・タイプ、長さ、精度、位取り、およびコード化スキームは、 完全に一致している必要があります。 CREATE FUNCTION ステートメントが実行されたときの表またはビューの記述が使用されます。

さらにまた、遷移表の文字 FOR BIT DATA 列を、定義のときに指定された表で対応する列 が文字 FOR BIT DATA として定義されていない、表パラメーターに対する入力として渡すことはできません。 (この定義は、CREATE FUNCTION ステートメントに出てきます。) 同様に、 FOR BIT DATA でない遷移表の文字列を、定義のときに指定された表の対応する列が、 文字 FOR BIT DATA として定義されている、表パラメーターに対する入力として渡すことはできません。

テーブルロケータの使用に関する詳細は、「ユーザー定義関数またはストアドプロシージャでの移行テーブルへのアクセス 」を参照してください。

RETURNS TABLE (列名 データ型...)
この関数の出力が表であることを指定します。 キーワードの後に続く括弧は、 表の列の名前とデータ・タイプのリストを囲んでいます。
列名
列の名前を指定します。 名前は SQL ID で、この関数の RETURNS TABLE 文節内で固有でなければ なりません。
データ・タイプ
列のデータ・タイプを指定します。 この列は NULL 可能です。
AS LOCATOR
関数が実際の値でなく値のロケーターを戻すことを指定します。 AS LOCATOR は、 LOB データ・タイプまたは LOB データ・タイプに基づく特殊タイプに限り指定できます。
RETURNS GENERIC TABLE
これを指定すると、関数の出力が汎用表になります。 このオプションを指定できるのは、LANGUAGE C も指定されている場合のみです。

表関数が副選択の typed-correlation-clause を使用して参照されている場合、列の名前およびデータ・タイプを宣言する必要があります。

詳細は、 型付き相関節を参照してください。

SPEC IFIC 特定名
関数の固有の名前を指定します。 この名前は、スキーマ名によって暗黙的 または明示的に修飾されます。 名前 (スキーマ名を含む) は、現行サーバーに存在する他の関数の特 定名であってはなりません。

specific-name の非修飾形式は SQL ID です。 修飾形式は、SQL ID (スキーマ名) の後にピリオドと SQL ID が続く形式です。

スキーマ名を指定しないと、関数名 (function-name) の 明示的または暗黙的スキーマ名と同じになります。 スキーマ名を指定する場合は、 関数名の明示的または暗黙的スキーマ名と同じでなければなりません。

SPECIFIC 文節を指定しないと、デフォルトの特定名は関数の名前と同じになります。 ただし、関数名に固有の名前が指定されていない場合、または関数名が単一のアスタリスクの場合、Db2は以下の形式で特定の名前を生成します。
SQLxxxxxxxxxxxx
ここで、'xxxxxxxxxxxx'は、名前を固有にする 12 文字のストリングです。

特定名は SYSROUTINES カタログ表の SPECIFIC 列に保管されます。 特定の名前を使用すると、いくつかの SQL ステートメント (ALTER FUNCTION、COMMENT、DROP、GRANT、および REVOKEなど) およびDb2コマンド (START FUNCTION、STOP FUNCTION、および DISPLAY FUNCTIONなど) で関数を一意的に識別することができます。 ただし、関数をその特定名で呼び出すことはできません。

PARAMETER CCSID または VARCHAR
CCSID
文字またはグラフィック・ストリング・パラメーターのコード化スキームが ASCII、EBCDIC、または UNICODE のいずれであるかを指定します。 デフォルトのコード化スキームは、パラメーター・リストの CCSID 文節 か、または RETURNS TABLE 文節で指定されている値、またはインストール・パネル DSNTIPF の フィールド DEF ENCODING SCHEME で指定されている値になります。

この文節を使用すると、文字またはグラフィック・ストリング・パラメーターに対してコード化スキーム を容易に指定することができます。 この PARAMETER CCSID 文節のほかに個々のパラメーターに対して 個別に CCSID 文節が指定されている場合、すべての CCSID 文節で指定 されている値が、この文節で指定されている値と同じでなければなりません。

この文節は、メッセージ・トークンおよび DBINFO などのルーチンのシステム生 成パラメーターに使用されるコード化スキームも指定します。

VARCHAR
可変長文字ストリング・パラメーター値の表記を指定します。これに は、LANGUAGE C を指定する関数に対してその関数の出力が含まれます (該当する 場合には)。

このオプションを指定できるのは、LANGUAGE C も指定されている場合のみです。

NULTERM
可変長文字ストリング・パラメーターが NUL 終了ストリング形式で 表記されることを指定します。
構造化
可変長文字ストリング・パラメーターが VARCHAR 構造形式で表記されることを指定します。

PARAMETER VARCHAR 文節の使用時、PARAMETER CCSID 指定時のような個々のパラ メーターの VARCHAR 形式を指定する方法はありません。 PARAMETER VARCHAR 文節が適用可能なのは、関数のパラメーター・リスト内および RETURNS TABLE 文節内にあるパラメーターに対してのみです。 PARAMETER VARCHAR 文節は、ルーチンのシ ステム生成パラメーター (メッセージ・トークンおよび DBINFO など) には適用で きません。

データ共用環境では、データ共用グループの全メンバーが PARAMETER VARCHAR 文節をサポートしてからでないと、この文節を指定すべきではありません。 一部のグループ・メンバーがこの文 節をサポートし、残りのメンバーがサポートしない状態で外部ルーチンで PARAMETER VARCHAR を指定すると、そのルーチンは異なるパラメーター形式を検出 することになります。この形式はどのグループ・メンバーがこのルーチンを呼び出 したかによって異なります。

EXTERNAL
登録される関数が外部プログラム言語で作成されたコードに基づいており、 その言語の文書化されたリンケージ規約とインターフェースに完全に準拠していることを指定します。

この NAME 文節を指定しないと、「NAME function-name」が 暗黙的に指定されたことになります。 この場合、function-name は 8 文字を超えてはいけません。

名前文字列または識別子
関数のロジックをインプリメントするユーザー作成コードを含むロード・モジュールの名前を指定します。

LANGUAGE のその他の値の場合、この名前は、8 文字を超えないストリング定数にできます。 この名前は、ロード・モジュールの命名規則に準拠していなければなりません。 各国語に対する英字のエクステンダーを、ロード・モジュール名の中で、最初の文字 として、また後続の文字として使用することができます。

Db2は、関数の呼び出し時にロード・モジュールをロードします。 このロード・モジュールは、関数本体を含むプログラムがコンパイルおよびリンク・エディットされるとき作成されます。 ロード・モジュールは、CREATE FUNCTION ステートメントの 実行時には存在する必要はありません。 ただし、関数の呼び出し時には存在していて、現行サーバーによってアクセス可能でなければなりません。

EXTERNAL 文節は次のいずれかの方法で指定できます。
  EXTERNAL
  EXTERNAL NAME PKJVSP1
  EXTERNAL NAME 'PKJVSP1'
外部プログラム名を指定する場合は、NAME キーワードの指定が必要です。 例えば、次の構文は無効です。
  EXTERNAL PKJVSP1
LANGUAGE
関数プログラムの作成に使用されるアプリケーション・プログラミング言語を指定します。 すべてのプログラムは、 IBM® の Language Environment® 環境で動作するように設計されていなければならない。
ASSEMBLE
関数はアセンブラーで作成されます。
C
この関数は、C または C++ で書かれています。VARCHAR 文節を指定できるのは、LANGUAGE C が指定されている場合だけです。
COBOL
関数は、オブジェクト指向言語拡張機能を含め、COBOL で作成されます。
PLI
関数は PL/I で作成されます。
PARAMETER STYLE SQL
関数プログラムが、呼び出し SQL ステートメントとの入力パラメーターの 受け取りと値を戻すために用いるリンケージ規約を指定します。

PARAMETER STYLE SQL は、入力および出力としての NULL 値の受け渡しをサポートするパラメーター受け渡し規約を指定します。

RETURNS TABLE 文節が指定されている場合、呼び出し SQL ステートメントと関数の間で渡されるパラメーターには、 次のものがあります。
  • 関数に対して指定される入力パラメーター用の n 個のパラメーター
  • RETURNS TABLE 文節に指定される関数の結果列用の m 個のパラメーター
  • 入力パラメーターに対する標識変数用の n 個の パラメーター
  • RETURNS TABLE 文節に指定された関数の結果列に対する標識変数用の m 個のパラメーター。
  • Db2に戻される SQLSTATE
  • 関数の修飾名
  • 関数の特定名
  • Db2に戻される SQL 診断ストリング
  • スクラッチパッド (SCRATCHPAD が指定されている場合)
  • 呼び出しタイプ。
  • DBINFO 構造体 (DBINFO が指定されている場合)
RETURNS GENERIC TABLE 文節が指定されている場合、呼び出し SQL ステートメントと関数の間で渡されるパラメーターには、 次のものがあります。
  • 関数に対して指定される入力パラメーター用の n 個のパラメーター
  • 入力パラメーターに対する標識変数用の n 個の パラメーター
  • RETURNS GENERIC TABLE 文節に指定される関数の結果列用の m 個のパラメーター
  • 以下を含む結果表記述子:
    • SELECT ステートメント内の table-function-referencetyped-correlation-clause に指定されている関数の結果列 m
    • m の配列、結果列の値に対する 4 バイトのアドレス
    • m の配列、結果列の NULL 標識
  • Db2に戻される SQLSTATE
  • 関数の修飾名
  • 関数の特定名
  • Db2に戻される SQL 診断ストリング
  • スクラッチパッド (SCRATCHPAD が指定されている場合)
  • 呼び出しタイプ。
  • DBINFO 構造体 (DBINFO が指定されている場合)

渡されるパラメータリストの構造に関する詳細については、DBINFO構造を参照してください。

NOT DETERMINISTIC または DETERMINISTIC
関数が同じ入力引数を指定して呼び出されるたびに、その関数が同じ結果を戻すかどうかを指定します。
NOT DETERMINISTIC
関数は、同じ入力引数を指定して呼び出されるたびに同じ結果を戻さない場合があります。 関数は、結果に影響する状態値によって左右されます。 Db2は、この関数を参照する SELECT および SQL データ変更ステートメントを処理するときに、この情報を使用してビューと表式のマージを使用不可にします。 非 deterministic 関数の例として、乱数を生成する関数があります。SQL ステートメントを含む関数はすべてこれに該当します。

NOT DETERMINISTIC がデフォルトです。

DETERMINISTIC
関数は、同じ入力引数を指定して呼び出されるたびに常に同じ結果を戻します。 deterministic 関数の例としては、入力の平方根を計算する関数があります。 Db2 この情報を使用して、この関数を参照するSELECTおよびSQLデータ変更文のビューとテーブル式のマージを可能にします。 DETERMINISTIC はデフォルトではありません。 適用できる場合は、この関数を参照する SQL ステートメントに対して最適でないアクセス・パスが選択されることを防ぐために、DETERMINISTIC を指定してください。

Db2は、関数プログラムが DETERMINISTIC または NOT DETERMINISTIC の指定と一致していることを検査しません。

FENCED
関数が外部アドレス・スペースで実行され、関数がDb2ストレージを破損するのを防ぐことを指定します。

FENCED がデフォルトです。

RETURNS NULL ON NULL INPUT または CALLED ON NULL INPUT
実行時にいずれかの入力引数が NULL の場合に、関数を呼び出すかどうかを指定 します。
RETURNS NULL ON NULL INPUT
入力引数のいずれかが NULL の場合、関数を呼び出しません。 結果は、表に行がない、空表になります。 RETURNS NULL ON INPUT がデフォルトです。
CALLED ON NULL INPUT
いずれかの入力引数が NULL であるかどうかに関係なく、関数を呼び出し、NULL の引数値のテストは関数が行うようにします。 関数は、その論理に よっては、空の表を戻す場合があります。
READS SQL DATA CONTAINS SQL、または NO SQL
このルーチンが実行または呼び出すことができる SQL ステートメントおよびネストされたルーチンの分類を指定します。 データベース・マネージャーは、関数によって発行される SQL ステートメント、およびルーチンによってローカルに呼び出されるすべてのルーチンが、この指定と一致していることを検証します。ネストされたリモート・ルーチンが呼び出される場合、この検証は実行されません。 各文の分類については、 ルーチンのSQL文データアクセス分類を参照してください。
READS SQL DATA
この関数が、データ・アクセス標識 READS SQL DATA、CONTAINS SQL、または NO SQL のステートメントを実行できるように指定します。 この関数は、データの変更を行う SQL ステートメントは実行できません。
CONTAINS SQL
この関数が、アクセス標識 CONTAINS SQL または NO SQL の SQL ステートメントのみを実行できることを指定します。 この関数は、データの読み取りまたは変更を行うステートメントを実行できません。
NO SQL
この関数が、データ・アクセス種別 NO SQL の SQL ステートメントのみを実行できるように指定します。
EXTERNAL ACTION または NO EXTERNAL ACTION
Db2が管理しないオブジェクトの状態を変更するアクションを関数が実行するかどうかを指定します。 外部アクションの例としては、メッセージの送信やファイルへのレコードの書き込みがあります。

Db2は機能に RRS 接続を使用するため、Db2は RRS を使用する他のリソース・マネージャーとの 2 フェーズ・コミットに参加できます。 RRS を使用しないリソース・マネージャーの場合、非Db2リソースに対するコミット操作またはロールバック操作の調整は行いません。

EXTERNAL ACTION
この関数は、Db2が管理しないオブジェクトの状態を変更するアクションを実行できます。

EXTERNAL ACTION を指定した場合は、Db2

  • 関数を参照する SELECT ステートメントと SQL データ変更ステートメントのビューと表式をマテリアライズします。 このマテリアライズは、この関数を参照する SQL ステートメントに対して選択されるアクセス・パスに悪影響を及ぼす可能性があります。 関数が外部アクションを行わない場合は、EXTERNAL ACTION を指定しないでください。
  • FETCH 操作間で、関数を 1 つのタスク制御ブロック (TCB) から別の TCB へ移 動しません。
  • カーソルがクローズされるまで、別の関数またはストアード・プロシージャーによる TCB の使用を許可しません。 これは、WITH HOLD と宣言されたカーソルについてもあてはまります。

コミットおよびロールバック操作の制御下にあるDb2の外部で行われたリソースへの唯一の変更は、RRS の制御下で行われた変更です。

EXTERNAL ACTION がデフォルトです。

NO EXTERNAL ACTION
この関数は、 Db2 が管理していないオブジェクトの状態を変更するような処理は一切行いません。 Db2はこの情報を使用して、この関数を参照する SELECT および SQL データ変更ステートメントのビューと表式のマージを有効にします。 適用できる場合は、この関数を参照する SQL ステートメントに対して最適でないアクセス・パスが選択されることを防ぐために、NO EXTERNAL ACTION を指定してください。

グローバル変数の有効範囲は、ルーチンの範囲外ですが、NO EXTERNAL ACTION を指定すると、グローバル変数をルーチン本体に設定することができます。

NO PACKAGE PATH または PACKAGE PATH package-path
関数の実行時に使用するパッケージ・パスを指定します。 これは、関数と関連する DBRM がバインド されていると考えられるパッケージ・コレクションのリストです。
NO PACKAGE PATH
関数のパッケージ・コレクションのリストが、関数を呼び出すプログラムに対するパッケージ・コレクション ID のリストと 同じであることを指示します。 関数を呼び出すプログラムがパッケージを使用していない場合、Db2は CURRENT PACKAGE PATH 特殊レジスター、 CURRENT PACKAGESET 特殊レジスター、または PKLIST バインド・オプション (この順序で) を使用して、パッケージを解決します。 Db2 がこれら3つの項目を使用する方法については、「アプリケーションプランのバインド」 を参照してください。
PACKAGE PATH パッケージパス
SET CURRENT PACKAGE PATH 特殊レジスターと同じ形式で、パッケージ・コレクションのリストを指定します。

COLLID 文節 に PACKAGE PATH を指定すると、その COLLID 文節は、関数の呼び出し時に無視されます。

関数の作成時に指定される package-path 値は、その関数の呼び出し時にチェックされます。 package-path に SESSION_USER (あるいは USER)、PATH、または PACKAGE PATH が含まれていると、package-path の値が検査されるときにエラーが戻されます。

NO SCRATCHPAD または SCRATCHPAD
Db2が関数のスクラッチパッドを提供するかどうかを指定します。 関数 を再入可能にし、スクラッチパッドが 1 つの呼び出しから次の呼び出しまで情報を 保管するための関数用の領域を提供するよう、強くお勧めします。
NO SCRATCHPAD
関数に対するスクラッチパッドの割り当てと受け渡しを行わないように指定します。 NO SCRATCHPAD が デフォルトです。
スクラッチパッドの長さ
関数が初めて呼び出されたときに、Db2がスクラッチパッドにメモリーを割り振ることを指定します。 スクラッチパッドには、以下のような特性があります。
  • 長さは 1~32767の範囲でなければなりません。 デフォルト値は 100 バイトです。
  • Db2は、スクラッチパッドをすべての 2 進ゼロ (X'00''s) に初期化します。
  • スクラッチパッドは、その SQL ステートメントだけで有効です。 SQL ステートメント内で関数が参照されるたびに、スクラッチパッドが 1 つ割り当てられます。 例えば、SCRATCHPAD キーワードを指定して関数 UDFX を定義した場合、次の SQL ステートメント内では UDFX が 2 回参照されているので、2 つのスクラッチパッドが割り当てられます。
        SELECT *
        FROM TABLE (UDFX(A)), TABLE (UDFX(B));
  • スクラッチパッドは持続します。 Db2 関数が呼び出されるたびに、その内容を保持します。 関数がある呼び出しでスクラッチパッドを変更すると、その内容は次回の呼び出しまで そのままです。 Db2 SQL文の実行を開始する際にスクラッチパッドを初期化します。 Db2 相関サブクエリが実行を開始した際にスクラッチパッドをリセットしない。
  • スクラッチパッドを、関数が獲得するシステム・リソースの中心拠点にすることができます。 この関数がシステム・リソースを獲得する場合、FINAL CALL を指定して、関数がそのシステム・リソースを解放できるように、Db2がもう一度その関数を呼び出すようにします。

関数が呼び出されるたびに、Db2は、スクラッチパッドのアドレスが入っている関数に追加の引数を渡します。

SCRATCHPADを指定した場合、Db2

  • FETCH 操作間で、関数を 1 つのタスク制御ブロック (TCB) から別の TCB へ移 動しません。
  • カーソルがクローズされるまで、別の関数またはストアード・プロシージャーによる TCB の使用を許可しません。 これは、WITH HOLD と宣言されたカーソルについてもあてはまります。
NO FINAL CALL または FINAL CALL
関数に対する最初の呼び出し 最終呼び出し を行うかどうかを指定します。
NO FINAL CALL
関数に対する最初の呼び出しと最終呼び出しは行われません。 NO FINAL CALL がデフォルトです。
FINAL CALL
関数に対する最初の呼び出しと最終呼び出しは、1 回以上のオープンフェッチ、 またはクローズ呼び出し に加えて行われます。
呼び出しのタイプは次のとおりです。
最初の呼び出し
最初の呼び出し は、関数が FINAL CALL を指定して 定義された場合だけ行われます。 最初の呼び出しの前に、スクラッチパッドが 2 進ゼロ に設定されます。 引数値が関数に渡され、関数はメモリーを獲得するか、 または他の一回限りのリソースの初期化を実行することができます。 ただし、この関数はデータをDb2に戻すことはできませんが、SQL 状態および診断メッセージの引数の戻り値を設定することができます。
オープン呼び出し
オープン呼び出し は、関数がエラーを戻さない場合に 起こります。 関数が NO FINAL CALL を指定して定義された場合に限り、 スクラッチパッドが 2 進ゼロに設定されます。 引数値が関数に渡され、関数は 任意の一回限りの必要な初期化アクションを実行することができます。 しかし、この関数はデータをDb2に戻すことはできません。
フェッチ呼び出し
フェッチ呼び出し は、関数が最初の呼び出しまたは オープン呼び出しの間にエラーを戻さない場合に起こります。 引数値が関数に渡され、Db2は関数がデータの行または表の終わり条件を返すことを予期しています。 スクラッチパッド も関数に渡される場合、スクラッチパッドは直前の呼び出しから変更されていない状態のままになっています。
クローズ呼び出し
クローズ呼び出し は、関数が最初の呼び出し、 オープン呼び出し、またはフェッチ呼び出しの間にエラーを戻さない場合に起こります。 SQL-argument または SQL-argument-ind の値は関数に渡されず、関数がこれらの値を 調べようとすると、予測できない結果が起こる可能性があります。 スクラッチパッド も関数に渡される場合、スクラッチパッドは直前の呼び出しから変更されていない状態のままになっています。

この関数は、データをDb2に戻すことはできませんが、SQL 状態および診断メッセージの引数の戻り値を設定することができます。 また クローズ呼び出しでは、NO FINAL CALL を指定して設計された関数が、獲得した システム・リソースを解放する必要があります。 (FINAL CALL を指定して設計された関数 は、最終呼び出しで獲得したリソースを解放するべきです。)

最終
最終呼び出し は、最初の呼び出しとバランスをとるもの で、最初の呼び出しと同様、関数が FINAL CALL を指定して定義された場合だけ行われます。 関数は、SQL-state 引数と diagnostic-message 引数の戻り値を設定することができます。 関数は、獲得されたシステム・リソースの解放も行う必要があります。 最終呼び出しは次のような場合に行われます。
  • ステートメントの終わり: カーソル指向のステートメントのためにカーソルがクローズされたか、またはステートメントの実行が完了したとき。
  • トランザクションの終わり: ステートメント処理の 通常の終わりが起こらない時。 例えば、アプリケーションの論理がなんらかの理由で カーソルのクローズを迂回する場合。

コミット、ロールバック、またはアボート操作によって最終呼び出しが行われた場合、 関数は、呼び出されている間は SQL ステートメントを出すことができません。

DISALLOW PARALLEL
Db2が関数の並列処理を考慮しないことを指定します。
NO DBINFO または DBINFO
関数を呼び出すときに、追加の状況情報を渡すかどうかを指定します。
NO DBINFO
補足情報を渡しません。 NO DBINFO がデフォルト値です。
DBINFO
関数を呼び出すときに追加の引数を渡します。 この引数は、アプリケーション実行時の許可 ID、スキーマ名、関数が挿入または更新中の表または列の名前、および関数を呼び出したデータベース・サーバーの ID などの情報を含む構造です。 引数およびその構造の詳細については、 DBINFO構造を参照してください。
基数 整数
関数が戻すと予想される行数の見積もりを指定します。 この数字は、最適化のために使用されます。 整数値は0~2147483647の範囲でなければなりません。

CARDINALITY を指定しない場合、Db2は有限値を想定します。 有限値は、Db2が想定している RUNSTATS ユーティリティーが統計情報を収集していない表についての値と同じです。

関数に無限カーディナリティーがある場合、関数は表の終わり条件を戻さず、常に行を戻します。その後、表の終わりを正しく機能させるために必要な照会を中断する必要があります。 したがって、GROUP BY と ORDER BY を伴う照会にこのような関数を使用することは避 けてください。

NO COLLID または COLLID collection-id
関数の実行時に使用されるパッケージ・コレクションを指定します。 これは、関数プログラムと関連する DBRM がバイン ドされているパッケージ・コレクションです。
NO COLLID
関数のパッケージ・コレクションは、関数を呼び出すプログラムのものと同じです。 トリガーが関数を呼び出す場合、トリガー・パッケージのコレクションが使用されます。 呼び出し側プログラムがパッケージを使用していない場合、Db2は CURRENT PACKAGE PATH 特殊レジスター、CURRENT PACKAGESET 特殊レジスター、または PKLIST バインド・オプション (この順序で) を使用してパッケージを解決します。 Db2 がこれら3つの項目を使用する方法の詳細については、「 Db2 がパッケージリストを解決する際に使用する値を上書きする 」のパッケージ解決に関する情報を参照してください。

NO COLLID がデフォルトです。

COLLID collection-id
外部の実行時に使用されるパッケージ・コレクションの名前。
WLM ENVIRONMENT
関数を実行する WLM (ワークロード・マネージャー) のアプリケーション環境を指定します。 WLM 環境の name は SQL ID です。

WLM ENVIRONMENT を指定しない場合、関数はインストール時に指定された WLM が確立した ストアード・プロシージャー・アドレス・スペースで実行されます。

名前
関数を実行する WLM 環境。 別のユーザー定義関数またはストアード・プロシージャーがこの関数を呼び出し、その呼び出しルーチンが WLM 環境に関連付けられていないアドレス・スペースで実行されている場合、Db2はその機能要求を別のアドレス・スペースに経路指定します。
(名前,*)
SQL アプリケーション・プログラムが関数を直接呼び出すとき、関数を実行する WLM 環境。

別のユーザー定義関数またはストアード・プロシージャーが関数を呼び出すと、 その関数は呼び出しルーチンが使用するのと同じ環境で実行されます。 この場合、WLM 環境で関数を実行するための許可は、呼び出しルーチンの許可だけで十分なため、検査されません。

ユーザーは、指定された WLM 環境で関数を実行するための適切な許可を 持っている必要があります。

ASUTIME
関数を 1 回呼び出すのに使用できるプロセッサー時間の合計量を、CPU サービス単位で指定します。 この値は、リソース限定表の ASUTIME 列とは無関係です。

関数をデバッグする際に、制限を設けると、関数がループに入り込んだ時に役立ちます。 サービス・ユニットに関する情報は、 z/OS MVS 『Initialization and Tuning Guide 』を参照のこと。

NO LIMIT
サービス単位に制限はありません。 NO LIMIT がデフォルトです。
LIMIT 整数
CPUサービスユニットの数の制限は、1~2147483647の範囲の正の整数です。 プロシージャーが、指定された値より多くのサービス単位を使用する場合、Db2はプロシージャーを取り消します。 プロシージャーの並列タスクによって使用される CPU サイクルは、指定された ASUTIME LIMIT には提供されません。
STAY RESIDENT
関数の終了時に、関数のロード・モジュールがメモリー内に常駐するかどうかを指定します。
いいえ
ロード・モジュールは、関数の終了後にメモリーから削除されます。 再入不可関数には NO を 使用してください。 デフォルトはNOです。
はい
ロード・モジュールは、関数の終了後もメモリー内に常駐します。 再入可能関数には YES を使用してください。
PROGRAM TYPE
関数プログラムがメインルーチンとして実行されるかサブルーチンとして 実行されるかを指定します。
SUB
関数はサブルーチンとして実行されます。 SUB がデフォルトです。
MAIN
関数はメインルーチンとして実行されます。
セキュリティー
RACF などの外部セキュリティ製品と機能がどのように連携し、SQL以外のリソースへのアクセスを制御するかを指定します。
Db2
関数は、外部セキュリティー環境を必要としません。 関数が外部セキュリティー製品の保護する リソースにアクセスすると、そのアクセスは、WLM が確立したストアード・プロシージャー・アドレス・スペースと関連する許可 ID を使用して行われます。

Db2がデフォルトです。

ユーザー
外部セキュリティー環境を関数のために設定する必要があります。 関数が外部セキュリティー製品の保護するリソースにアクセスすると、そのアクセスは 関数を呼び出したプロセスの 1 次許可 ID を使用して行われます。
DEFINER
外部セキュリティー環境を関数のために設定する必要があります。 関数が外部セキュリティー製品の保護するリソースにアクセスすると、そのアクセスは 関数の所有者の許可 ID を使用して実行されます。
実行オプション runtime-options
関数に使用する Language Environment ランタイムオプションを指定します。 runtime-options は、254 バイトを超えない文字ストリングとして指定する必要があります。 RUN OPTIONS を指定しないか、空の文字列を渡すと、 Db2 は実行時オプションを Language Environment に渡さず、 Language Environment はインストール時のデフォルトを使用する。

Language Environment ランタイム・オプションの説明については、 Language Environment プログラミング・リファレンス を参照のこと。

INHERIT SPECIAL REGISTERS または DEFAULT SPECIAL REGISTERS
ルーチンに入ったときに特殊レジスターを設定する方法を指定します。
INHERIT SPECIAL REGISTERS
ユーザー定義関数またはストアドプロシージャの特殊レジスタの特性に関する表に列挙された規則に従って、特殊レジスタの値が継承されることを指定します。
DEFAULT SPECIAL REGISTERS
ユーザー定義関数またはストアドプロシージャの特殊レジスタの特性に関する表のルールで示されているように、特殊レジスタがデフォルト値に初期化されることを指定します。
STATIC DISPATCH
関数解決時には、Db2は関数パラメーターの静的 (または宣言された) タイプに基づいて関数を選択します。 STATIC DISPATCH がデフォルトです。
STOP AFTER SYSTEM DEFAULT FAILURES、STOP AFTER nn FAILURES、または CONTINUE AFTER FAILURE
一定の数の障害が発生した後、ルーチンを停止状態にするかどうかを指定します。
STOP AFTER SYSTEM DEFAULT FAILURES
インストール・パネル DSNTIPX のフィールド MAX ABEND COUNT の値によって示された回数の障害が発生した後、このルーチンを停止状態にするように指定します。 これはデフォルトです。
nn回失敗したら停止する
nn 回の障害が発生した後、このルーチンを停止状態にするように指定します。 nnの値は、1~32767の整数です。
CONTINUE AFTER FAILURE
どの障害が発生してもこのルーチンを停止状態にしないように指定します。
NOT SECURED または SECURED
関数が行アクセス制御と列アクセス制御においてセキュアであると見なされるかどうかを指定します。
NOT SECURED
関数が行アクセス制御と列アクセス制御においてセキュアであると見なされないことを指定します。

NOT SECURED がデフォルトです。

表でアクティブな列アクセス制御が使用されている場合、関数の呼び出し時に、関数の引数が、列マスクが有効になっている列を参照してはなりません。

SECURED
関数が行アクセス制御と列アクセス制御においてセキュアであると見なされることを指定します。

行の許可または列マスクで関数が参照される場合、SECURED を使用してこの関数を定義する必要があります。

CREATE FUNCTION (外部表) の注意事項

すべてのタイプのユーザー定義関数に関する考慮事項:
すべての種類のユーザー定義関数に共通する考慮事項については、「CREATE FUNCTION ステートメント(概要)」 を参照してください。
文字ストリングの表記上の考慮事項:
PARAMETER VARCHAR 文節は、C での NUL 終了ストリングのネイティブ使用のために、LANGUAGE C 関数に固有のものになります。 VARCHAR 構造表現は、文字ストリング・データに組み込み NUL 終止符が含まれていることが既知である場合に役立ちます。 また、文字ストリング・データには組み込み NUL 終止符が含まれていないことを保証できない場合も有用です。

PARAMETER VARCHAR は、固定長文字ストリング、VARCHAR FOR BIT DATA、CLOB、 DBCLOB、または暗黙的に生成されたパラメーターには適用できません。 PARAMETER VARCHAR 文節が VARCHAR FOR BIT DATA に適用できない理由は、BIT DATA には X'00' 文字が含まれる可能性が あり、その値の表記が長さ情報で始まるからです。 PARAMETER VARCHAR 文節が LOB データに適用できない理由は、LOB 値の表記が長 さ情報で始まるからです。

PARAMETER VARCHAR は、外部関数に対して暗黙的に指定されるオプショナル・パ ラメーターには適用されません。 例えば、LANGUAGE C の CREATE FUNCTION ステートメントは、PARAMETER STYLE SQL も指定する必要があります。これは SQLSTATE NULL 終了文字ストリングを戻します。SQLSTATE は VARCHAR 構造化形式で表されません。 同様に、データベース・マネージャーに戻される 関数の修飾名、関数の固有名、または SQL 診断ストリングを表すどのパラメータ ーも、VARCHAR 構造化形式で表されないことになります。

WLM 環境での外部関数の実行:
WLM ENVIRONMENT 文節を使用して、関数が実行されるアドレス・スペースを指定できます。 異なる WLM 環境を使用すれば、 プログラムのグループを他のプログラムのグループから分離することができます。 例えば、セキュリティーの要件 に基づいてプログラムを分離し、従業員の給与などの データを扱うすべての給与計算アプリケーションを 1 つの WLM 環境に入れる よう選択することもできます。

ユーザーがセンシティブ WLM 環境で関数を定義するのを防ぐために、Db2は外部セキュリティー・マネージャーを呼び出して、指定された WLM 環境を参照する CREATE FUNCTION ステートメントをユーザーが発行する許可を持っているかどうかを判別します。 次の例は、 Db2 ユーザー DB2USER1 が、 Db2 サブシステム DB2A 上で、PAYROLLというWLM環境で実行される関数を登録することを許可する RACF コマンドを示しています。

   PERMIT DB2A.WLMENV.PAYROLL CLASS(DSNR) ID(DB2USER1)  ACCESS(READ)

詳細については、「WLM環境におけるストアドプロシージャ作成の権限管理 」を参照してください。

表関数が汎用の表関数かどうかの判別:
表関数が汎用の表関数かどうかを識別するために、SYSIBM.SYSROUTINES カタログ表を照会できます。 この関数は、ROUTINETYPE 列の値が 'F'、FUNCTIONTYPE 列の値が 'T' で、RESULT_COLS 列の値が 0 (ゼロ) の場合は、汎用表関数です。
代替構文およびシノニム:
Db2ファミリー内の以前のリリースのDb2または他の製品との互換性を提供するために、Db2は以下の代替構文をサポートしています。
  • NOT DETERMINISTIC のシノニムとして VARIANT
  • DETERMINISTIC のシノニムとして NOT VARIANT
  • RETURNS NULL ON NULL INPUT のシノニムとして NOT NULL CALL
  • CALLED ON NULL INPUT のシノニムとして NULL CALL
  • PARAMETER STYLE SQL のシノニムとして PARAMETER STYLE DB2SQL
  • TIMEZONE は、 TIME ZONE の代替として指定できます。

CREATE FUNCTION(外部テーブル)の例

以下の例は、テキスト管理システム内の既知の文書ごとに 1 つの文書 ID 列で構成される行を戻すために作成された表関数を登録します。 最初のパラメーターは指定された対象領域をマッチングし、 2 番目パラメーターには指定されたストリングが入ります。

単一セッションのコンテキストの中では、表関数は常に同じ表を戻します。 したがって、表関数は DETERMINISTIC として定義されます。 このほか、 表関数は並列で処理できないため、DISALLOW PARALLEL キーワードが 追加されています。

DOCMATCH の出力のサイズは非常に可変ですが、CARDINALITY 20 は代表的な値であり、Db2を支援するために指定されます。
    CREATE FUNCTION DOCMATCH (VARCHAR(30), VARCHAR(255))
                       RETURNS TABLE (DOC_ID CHAR(16))
      EXTERNAL NAME ABC
      LANGUAGE C
      PARAMETER STYLE SQL
      NO SQL
      DETERMINISTIC
      NO EXTERNAL ACTION
      FENCED
      SCRATCHPAD
      FINAL CALL
      DISALLOW PARALLEL
      CARDINALITY 20;
例 2: 以下の例では、汎用表関数を登録します。
CREATE FUNCTION tf6(p1 VARCHAR(10))
	RETURNS GENERIC TABLE
	EXTERNAL NAME 'tf6'
	LANGUAGE C
	PARAMETER STYLE SQL
	DETERMINISTIC
	NO EXTERNAL ACTION
	FENCED
	SCRATCHPAD
	FINAL CALL;
LANGUAGE C を指定する必要があり、SELECT 文節で表関数が参照されている場合に結果列の名前とデータ・タイプが宣言されている必要があります。