CREATE FUNCTION (外部表) ステートメント
CREATE FUNCTION (外部表) ステートメントは、ユーザー定義の外部表関数を現行サーバーに登録する場合に使用されます。
表関数 は、SELECT の FROM 節で使用することができ、行を一度に 1 行戻すことによって、SELECT に表を戻します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- データベースに対する CREATE_EXTERNAL_ROUTINE 権限、および以下の少なくとも 1 つの権限
- データベースに対する IMPLICIT_SCHEMA 権限 (関数の暗黙または明示のスキーマ名が存在しない場合)
- スキーマに対する CREATEIN 特権 (関数のスキーマ名が存在する場合)
- スキーマに対する SCHEMAADM 権限 (関数のスキーマ名が存在する場合)
- DBADM 権限
グループ特権は、CREATE FUNCTION ステートメントで指定された表やビューに対しては考慮されません。
- データベースに対する CREATE_NOT_FENCED_ROUTINE 権限
- DBADM 権限
fenced 関数を作成する場合には、さらに別の権限や特権は必要ありません。
既存の関数を置換するには、ステートメントの許可 ID が既存の関数の所有者でなければなりません (SQLSTATE 42501)。
SECURED オプションを指定する場合は、 ステートメントの許可 ID に、SECADM または CREATE_SECURE_OBJECT 権限が含まれている必要があります (SQLSTATE 42501)。
構文
- 1 FOR BIT DATA 節とその後に続く他の列制約とは、任意の順序で指定できます。FOR BIT DATA 節をストリング単位の CODEUNITS32 とともに指定することはできません (SQLSTATE 42613)。
- 2 Db2SECURITYLABEL は、保護対象表の行セキュリティー・ラベル列を定義するために使用しなければならない組み込み特殊タイプです。
- 3 タイプ Db2SECURITYLABEL の列の場合、NOT NULL WITH DEFAULT は暗黙指定になるので、明示的に指定することはできません (SQLSTATE 42842)。タイプ Db2SECURITYLABEL の列のデフォルト値は、セッション許可 ID の書き込みアクセスのためのセキュリティー・ラベルです。
- 4 LANGUAGE OLE DB 外部表関数の作成の詳細は、『CREATE FUNCTION (OLE DB 外部表)』を参照してください。LANGUAGE SQL 表関数の作成の詳細は、 「CREATE FUNCTION (SQL スカラー、表、または行)」を参照してください。
説明
- 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 および比較演算子です。
関数のシグニチャーに何らかの差異があれば、同じ名前を複数の関数に使用することができます。 禁止されてはいませんが、外部ユーザー定義表関数の名前として、 組み込み関数と同じ名前を指定すべきではありません。
- (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
- 入力パラメーターのデータ・タイプを指定します。
データ・タイプは、組み込みデータ・タイプ、特殊タイプ、構造化タイプ、または参照タイプにすることができます。
各組み込みデータ・タイプの詳細な説明は、『CREATE TABLE』を参照してください。
一部のデータ・タイプは、すべての言語でサポートされません。SQL データ・タイプとホスト言語データ・タイプの対応関係の詳細については、「組み込み SQL アプリケーション内で SQL データ・タイプにマップするデータ・タイプ」を参照してください。
- 日時タイプのパラメーターは文字データ・タイプとして受け渡され、そのデータは ISO 形式で受け渡されます。
- DECIMAL (および NUMERIC) は、LANGUAGE C と OLE では無効です (SQLSTATE 42815)。
- XML は、LANGUAGE OLE では無効です。
- 関数内での XML 値の表現は、関数呼び出しでパラメーターとして渡される XML 値をシリアライズしたバージョンなので、タイプ XML のパラメーターは構文
XML AS CLOB(n)を使用して宣言する必要があります。 - CLR は 28 より大きい DECIMAL スケールをサポートしていません (SQLSTATE 42613)。
- 配列タイプを指定することはできません (SQLSTATE 42815)。
- BINARY および VARBINARY データ・タイプは、LANGUAGE CLR と OLE では無効です (SQLSTATE 42815)。
ユーザー定義構造化タイプの場合、適切なトランスフォーム関数が関連するトランスフォーム・グループに存在する必要があります。
参照タイプの場合、パラメーターが有効範囲を指定されていない場合は、パラメーターを REF(type-name) で指定できます。
- DEFAULT
- パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。デフォルトとして指定できる特殊レジスターは、
列のデフォルトに指定できる特殊レジスターと同じです (CREATE TABLE ステートメントの default-clause を参照)。
他の特殊レジスターは、式を使用することによってデフォルトとして指定できます。
式としては、『式』で説明されている任意のタイプの式を使用できます。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、対応する引数はプロシージャーの呼び出し時に省略できません。expression の最大サイズは 64K バイトです。
デフォルトの式は、SQL データを変更してはなりません (SQLSTATE 428FL または SQLSTATE 429BL)。式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません (SQLSTATE 42821)。
デフォルトは ARRAY、ROW、または CURSOR タイプのパラメーターには指定できません (SQLSTATE 429BB)。
- AS LOCATOR
- 実際の値の代わりにパラメーターの値へのロケーターを関数に受け渡すことを指定します。
LOB データ・タイプを持つパラメーター、または LOB データ・タイプに基づく特殊タイプにのみ AS LOCATOR を指定します (SQLSTATE 42601)。
値の代わりにロケーターを受け渡すと、関数に受け渡されるバイト数を特にパラメーターの値が非常に大きい場合に少なくできます。
AS LOCATOR 節は、データ・タイプをプロモート可能かどうかの判別に効果はなく、また関数解決で使用される関数シグニチャーにも影響を与えません。
関数が FENCED で NO SQL オプションを持っている場合、 AS LOCATOR 節は指定できません (SQLSTATE 42613)。
- RETURNS
- 関数の出力を指定します。
- TABLE
- 関数の出力が表であることを指定します。
このキーワードに続く括弧は、表の列の名前とタイプのリストを区切るものです。
このリストのスタイルは、他の指定 (例えば、制約) のない単純な CREATE TABLE ステートメントのスタイルと類似しています。
255 列以内が許可されます (SQLSTATE 54011)。
- column-name
- この列の名前を指定します。 名前を修飾することはできず、表の複数の列に対して同じ名前を使用することはできません。
- data-type2
- 列のデータ・タイプを指定します。構造化タイプ以外であれば、特定言語において、UDF 作成のパラメーターとしてサポートされるどのようなデータ・タイプでも構いません (SQLSTATE 42997)。
- AS LOCATOR
- data-type2 が LOB タイプまたは LOB タイプに基づく特殊タイプの場合、
このオプションを使用すると、
関数は結果表でインスタンス化される LOB 値のロケーターを戻します。
この節で使用できる有効なタイプについては、『CREATE FUNCTION (外部スカラー)』ステートメント・トピックで説明されています。
- GENERIC TABLE
- これを指定すると、関数の出力が汎用表になります。 この節は、LANGUAGE JAVA 節および PARAMETER STYLE Db2GENERAL 節を指定した場合にのみ、許可されます (SQLSTATE 42613)。
- 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)。
- EXTERNAL
- この節は、CREATE FUNCTION ステートメントが、外部プログラミング言語で書かれたコードに基づく新しい関数を登録するのに使用されており、
文書化されたリンケージの規則とインターフェースに準拠していることを示します。
NAME 節を指定しない場合、"NAME function-name" が想定されます.
- NAME 'string'
- この節は、定義する関数をインプリメントするためのユーザー作成コードを指定します。
'string' オプションは、最大 254 バイトのストリング定数です。ストリングに使用される形式は、指定した LANGUAGE によって異なります。
- LANGUAGE C の場合:
指定する string (ストリング) は、 作成しているユーザー定義関数を実行するためにデータベース・マネージャーが呼び出すライブラリー名と、 そのライブラリー中の関数名です。 ライブラリー (およびそのライブラリー中の関数) は、 CREATE FUNCTION ステートメントの実行時に存在している必要はありません。 ただし、関数が SQL ステートメントで使用される時点では、 そのライブラリーとそのライブラリー内の関数が存在していなければならず、 しかもデータベース・サーバーのマシンからアクセス可能でなければなりません。
単一引用符内に、余分なブランクを使用することはできません。
- library_id
- 関数を含むライブラリー名を指定します。
データベース・マネージャーは、次のようにしてこのライブラリーを特定します。
オペレーティング・システム ライブラリー名の場所
Linux
AIX®
Solaris
HP-UX
myfuncが library_id として指定され、データベース・マネージャーが /u/production から実行されている場合、データベース・マネージャーはライブラリー /u/production/sqllib/function/myfunc で関数を探します。Windows データベース・マネージャーは、環境変数 LIBPATH または PATH に指定されているディレクトリー・パスで関数を探します。 - absolute_path_id
- 関数を含んでいるファイルの絶対パス名を指定します。
以下の表に示すとおり、形式はオペレーティング・システムによって異なります。
オペレーティング・システム 絶対パス名の例
Linux
AIX
Solaris
HP-UX
'/u/jchui/mylib/myfunc' という値を指定すると、データベース・マネージャーは /u/jchui/mylib で myfunc 共有ライブラリーを探します。 Windows 'd:¥mylib¥myfunc.dll' という値を指定すると、データベース・マネージャーは、d:¥mylib ディレクトリーからダイナミック・リンク・ライブラリー myfunc.dll をロードします。 絶対パス ID がルーチン本体の識別に使用されている場合 は、.dll 拡張子を必ず付加してください。 - ! func_id
- 呼び出される関数の入り口点名を指定します。
! は、ライブラリー ID と関数 ID との間の区切り文字です。
以下の表に示すとおり、形式はオペレーティング・システムによって異なります。
オペレーティング・システム 関数の入り口点名
Linux
AIX
Solaris
HP-UX
'mymod!func8' という値を指定すると、データベース・マネージャーはライブラリー $inst_home_dir/sqllib/function/mymod を探し、そのライブラリー内の入り口点 func8 を使用します。 Windows 'mymod!func8' という値を指定すると、データベース・マネージャーは mymod.dll ファイルをロードし、そのダイナミック・リンク・ライブラリー (DLL) 内の func8() 関数を呼び出します。
ストリングの形式が正しくない場合には、エラーが戻されます (SQLSTATE 42878)。
いずれの場合も、すべての外部関数の本体は、すべてのデータベース・パーティションで使用可能なディレクトリーにある必要があります。
- LANGUAGE JAVA の場合:
指定する string には、 作成中のユーザー定義関数を実行するためにデータベース・マネージャーが呼び出す、 任意指定の jar ファイル、クラス ID、およびメソッド ID が含まれています。 クラス ID とメソッド ID は、 CREATE FUNCTION ステートメントの実行時には存在している必要はありません。 jar_id を指定する場合、 ID は、 CREATE FUNCTION ステートメントの実行時に存在していなければなりません。 ただし、関数を SQL ステートメントで使用する時点で、 メソッド ID は存在しなければならず、 データベース・サーバーのマシンからアクセス可能でなければなりません。
単一引用符内に、余分なブランクを使用することはできません。
- jar_id
- jar の集合をデータベースへインストールしたときに、 その jar の集合に付けられた jar ID を指定します。 これは、単純 ID またはスキーマ修飾 ID のいずれかにすることができます。 例えば、'myJar' や 'mySchema.myJar' のようになります。
- class_id
- Java™ オブジェクトのクラス ID を指定します。
クラスがパッケージの一部である場合、クラス ID の部分に
完全なパッケージ接頭部 (例: 'myPacks.UserFuncs') が含まれている必要があります。
Java 仮想マシンがクラスを探すディレクトリーは、以下の表に示すように、オペレーティング・システムによって異なります。
オペレーティング・システム Java 仮想マシンがクラスを探すディレクトリー
Linux
AIX
Solaris
HP-UX
'.../myPacks/UserFuncs/' Windows '...¥myPacks¥UserFuncs¥' - method_id
- 呼び出す Java オブジェクトのメソッド名を指定します。
- LANGUAGE CLR の場合:
指定された string は、 作成する関数を実行するためにデータベース・マネージャーが呼び出す .NET アセンブリー (ライブラリーまたは実行可能モジュール)、 そのアセンブリー内のクラス、およびそのクラス内のメソッドを表します。 モジュール、クラス、およびメソッドは、 CREATE FUNCTION ステートメントの実行時に存在している必要はありません。 ただし、関数を SQL ステートメントで使用する時点では、 モジュール、クラス、およびメソッドは存在していなければならず、 データベース・サーバーのマシンからアクセス可能でなければなりません。 そうでない場合、エラーが戻されます (SQLSTATE 42724)。
'/clr' コンパイラー・オプションで管理対象コード拡張を指定してコンパイルされている C++ ルーチンは、 'LANGUAGE C' ではなく 'LANGUAGE CLR' としてカタログする必要があります。 データベース・サーバーは、必要な実行時の決定を行えるようにするために、 .NET インフラストラクチャーがユーザー定義関数内で使用されていることを認識している必要があります。.NET インフラストラクチャーを使用するすべてのユーザー定義関数は、 'LANGUAGE CLR' としてカタログする必要があります。
名前は、単一引用符で囲む必要があります。 余分なブランクを使用することはできません。
- assembly
- クラスを含む DLL ファイルまたは他のアセンブリー・ファイルを指定します。
ファイル拡張子 (.dll など) まで指定します。
絶対パス名を指定しない場合、ファイルは、データベース製品のインストール・パスの関数ディレクトリーに存在していなければなりません。
例: c:¥sqllib¥function。
ファイルがインストール関数ディレクトリーのサブディレクトリーにある場合は、 絶対パスを指定せずに、ファイル名の前にサブディレクトリーを指定します。
例えば、インストール・ディレクトリーが c:¥sqllib であり、 アセンブリー・ファイルが c:¥sqllib¥function¥myprocs¥mydotnet.dll であるなら、 アセンブリーの指定は 'myprocs¥mydotnet.dll' とするだけで十分です。
このパラメーターの大文字小文字が区別されるかどうかは、ファイル・システムの設定と同じです。
- class_id
- 呼び出すメソッドが属するアセンブリー内のクラスの名前を指定します。 クラスが名前空間内にある場合は、 クラスだけでなく絶対名前空間も指定することが必要です。 例えば、クラス EmployeeClass が名前空間 MyCompany.ProcedureClasses にあるのであれば、 MyCompany.ProcedureClasses.EmployeeClass をクラスとして指定しなければなりません。 一部の .NET 言語用のコンパイラーはクラスの名前空間としてプロジェクト名を追加するため、 コマンド行コンパイラーと GUI コンパイラーのどちらを使用するかで動作が異なってくるので注意してください。 このパラメーターには、大文字と小文字の区別があります。
- method_id
- 指定したクラス内で呼び出されるメソッドを指定します。 このパラメーターには、大文字と小文字の区別があります。
- LANGUAGE OLE の場合:
指定する string は、 作成中のユーザー定義関数を実行するためにデータベース・マネージャーが呼び出す、 OLE のプログラム ID (progid) またはクラス ID (clsid)、およびメソッド ID です。 プログラム ID またはクラス ID、およびメソッド ID は、 CREATE FUNCTION ステートメントの実行時に存在している必要はありません。 ただし、関数が SQL ステートメントで使用される時点では、 メソッド ID は存在していなければならず、 データベース・サーバーのマシンからアクセス可能でなければなりません。 そうでない場合、エラーが戻されます (SQLSTATE 42724)。
単一引用符内に、余分なブランクを使用することはできません。
- progid
- OLE オブジェクトのプログラム ID を指定します。
progid は、データベース・マネージャーには解釈されず、 実行時に OLE API に転送されるだけです。 指定する OLE オブジェクトは、作成可能である必要があり、 実行時バインディング (ディスパッチに基づくバインディングとも呼ばれる) をサポートしている必要があります。
- clsid
- 作成する OLE オブジェクトのクラス ID を指定します。
OLE オブジェクトが progid を指定して登録されていない場合に、
progid を指定する代わりに使用することができます。
clsid の形式は次のとおりです。
{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}
ここで 'n' は英数字です。 clsid は、データベース・マネージャーには解釈されず、 実行時に OLE API に転送されるだけです。
- method_id
- 呼び出す OLE オブジェクトのメソッド名を指定します。
- LANGUAGE CPP の場合:
指定する string は、ライブラリー ID とライブラリー中のクラス ID です。これには、作成されるユーザー定義関数を実行するためにデータベース・マネージャーが呼び出す評価メソッドが含まれています。 ストリングの形式が正しくない場合には、エラーが戻されます (SQLSTATE 42878)。
ライブラリー (またはライブラリー中のクラス) は、CREATE FUNCTION ステートメントの実行時に存在している必要はありません。 ただし、関数が SQL ステートメントで使用される時点では、そのライブラリーとそのライブラリー中の該当のクラスは存在していなければならず、データベース・サーバーのマシンからアクセス可能でなければなりません。そうでない場合、エラーが戻されます (SQLSTATE 42724)。
すべての外部関数の本体は、すべてのデータベース・パーティションで使用可能なディレクトリーにある必要があります。
string は、以下のように指定できます。 単一引用符内に、余分なブランクを使用することはできません。- library_id
- 関数が入っているライブラリーの名前:
- UNIX システムの場合、指定されたライブラリー ID が
myfuncであり、データベース・マネージャーが/u/productionから実行されていると、データベース・マネージャーは、以下のライブラリーで関数を探します。/u/production/sqllib/function/myfunc - Windows オペレーティング・システムの場合、データベース・マネージャーは、LIBPATH または PATH 環境変数によって指定されているディレクトリー・パスで関数を探します。
- UNIX システムの場合、指定されたライブラリー ID が
- absolute_path_id
- 関数が入ったファイルの絶対パス。
例:
- UNIX システムの場合、次のように指定すると、データベース・マネージャーは
/u/jchui/mylibの中で myfunc 共有ライブラリーを探します。'/u/jchui/mylib/myfunc' - Windows オペレーティング・システムの場合、次のように指定すると、データベース・マネージャーは
d:¥mylibディレクトリーからダイナミック・リンク・ライブラリー myfunc.dll をロードします。
絶対パス ID がルーチン本体の識別に使用されている場合 は、.dll 拡張子を必ず付加してください。'd:¥mylib¥myfunc.dll'
- UNIX システムの場合、次のように指定すると、データベース・マネージャーは
- class_id
- 呼び出すメソッドが入っているクラスの名前。
例えば、'mymod!myclass'を指定した場合には、次のようになります。- UNIX システムでは、データベース・マネージャーはライブラリー
$inst_home_dir/sqllib/function/mymodを探し、そのライブラリー内の myclass クラスの評価メソッドを呼び出します。 - Windows オペレーティング・システムでは、データベース・マネージャーは mymod.dll ファイルをロードし、ダイナミック・リンク・ライブラリー (DLL) 内の myclass クラスの評価メソッドを呼び出します。
- LANGUAGE C の場合:
- NAME identifier
- この節は、定義している関数をインプリメントするユーザー作成コードの名前を指定します。 指定する identifier は SQL ID です。 SQL ID は、ストリングの library-id として使用されます。 区切られた ID でない場合、ID は大文字に変換されます。 ID がスキーマ名で修飾されている場合、スキーマ名の部分は無視されます。 この形式の NAME は、LANGUAGE C でのみ使用可能です。
- LANGUAGE
- この節は必須で、
ユーザー定義関数の本体が準拠している言語インターフェース規則を指定するのに使用します。
- C
- これは、データベース・マネージャーが、 ユーザー定義関数を C の関数であるかのように呼び出すことを意味します。 ユーザー定義関数は、標準 ANSI C プロトタイプで定義されている C 言語の呼び出しおよびリンケージの規則に準拠していなければなりません。
- JAVA
- データベース・マネージャーは、 Java クラスのメソッドとしてユーザー定義関数を呼び出します。
- CLR
- 将来の利用のために予約済み。
- OLE
- 将来の利用のために予約済み。
- CPP
- データベース・マネージャーは、C++ クラスの評価メソッドを呼び出すことにより、ユーザー定義関数を呼び出します。
- PARAMETER STYLE
- この節は、関数にパラメーターを渡し、
関数から値を戻すのに用いる規則を指定するために使用します。
- Db2GENERAL
- Java クラスのメソッドとして定義された外部関数との間で、 パラメーターを渡し、値を戻す場合に用いる規則を指定します。 これは、LANGUAGE JAVA を使用する場合にだけ指定できます。
- SQL
- C 言語の呼び出しとリンケージの規則、OLE 自動化オブジェクトによって公開されたメソッド、 または .NET オブジェクトの共有静的メソッドに準拠する規則を、 この外部メソッドとの間でパラメーターを渡し、値を戻す場合の規則として指定します。 これは、LANGUAGE C、LANGUAGE CLR、または LANGUAGE OLE を使用する場合に指定する必要があります。
- NPSGENERIC
-
C++ クラスのメソッドとして定義された外部関数との間で、パラメーターを渡し、値を戻す場合に用いる規則を指定します。これは、LANGUAGE オプションが CPP に設定されている場合にのみ指定できます。
NPSGENERIC がパラメーター・スタイルとして指定されているとき、UDF は nz.udx_ver2.Udf クラスの派生クラスとして C++ で記述されます。 このクラスは、以下の 2 つのメソッドに加え、そのコンストラクターとデストラクターを実装する必要があります。- static Udf* Udf::instantiate(UdxInit *pInit)
- 静的メンバー・メソッド instantiate()。これは、UDF 派生クラスの新規インスタンスをインスタンス化し、新規インスタンスへのポインターをクラス UDF ポインターとして返す必要があります。 エンジンはこのメソッドを使用して UDF オブジェクトのインスタンスを作成します。
- virtual ReturnValue Udf::evaluate()
- メンバー・メソッド evaluate()。これは、ユーザー関数を評価して値を呼び出し元に返すためにエンジンによって呼び出されます。
- 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 です。
データベースが Unicode データベースではないのに、 PARAMETER CCSID UNICODE を指定した関数を作成すると、 その関数は GRAPHIC タイプやユーザー定義タイプを取ることができません (SQLSTATE 560C1)。
データベースが Unicode データベースでない場合、 表関数を PARAMETER CCSID UNICODE を指定して作成できますが、 以下の規則が適用されます。- 表関数を作成するより前に、代替照合シーケンスをデータベース構成に指定する必要があります (SQLSTATE 56031)。 PARAMETER CCSID UNICODE 表関数は、 データベース構成に指定されている代替照合シーケンスと照合されます。
- CCSID ASCII を指定して作成された表または表関数と、 CCSID UNICODE を指定して作成された表または表関数とを、 1 つの SQL ステートメント内で両方とも使用することはできません (SQLSTATE 53090)。 このことは、ステートメント内で直接参照されている表および表関数、 および間接的に (例えば、参照整合性制約、トリガー、マテリアライズ照会表、およびビューの本体内の表によって) 参照されている表および表関数に適用されます。
- PARAMETER CCSID UNICODE を指定して作成された表関数は、 SQL 関数または SQL メソッド内では参照できません (SQLSTATE 560C0)。
- PARAMETER CCSID UNICODE を指定して作成された表関数を参照する SQL ステートメントは、 SQL 関数または SQL メソッドを呼び出すことができません (SQLSTATE 53090)。
- GRAPHIC タイプ、XML タイプ、およびユーザー定義タイプは、 PARAMETER CCSID UNICODE 表関数へのパラメーターとしては使用できません (SQLSTATE 560C1)。
- SQL ステートメントは常にデータベース・コード・ページで解釈されます。 特にこのことは、リテラル、16 進数リテラル、および区切り ID 内のすべての文字が データベース・コード・ページで表記されていなければならないということを意味します。 そうでないと、文字は置換文字によって置き換えられてしまいます。
データベースが Unicode ではなく、データベース構成に代替照合シーケンスが指定されている場合、 PARAMETER CCSID ASCII または PARAMETER CCSID UNICODE を指定した関数を作成できます。 関数とやり取りされるすべてのストリング・データは、適切なコード・ページに変換されます。
この節を LANGUAGE CPP、LANGUAGE OLE、LANGUAGE JAVA、LANGUAGE CLR とともに指定することはできません (SQLSTATE 42613)。
- DETERMINISTIC または NOT DETERMINISTIC
- この節は任意指定で、 特定の引数の値に対して関数が常に同じ結果を戻すか (DETERMINISTIC)、 それとも状態値に依存して関数の結果が影響を受けるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC 関数は、同一の入力で連続で呼び出しが行われたとき、常に同じ表を返します。 NOT DETERMINISTIC を指定すると、 同じ入力によって常に同じ結果が生じることを利用した最適化ができなくなります。 非 deterministic である表関数の例として、特殊レジスター、グローバル変数、非 deterministic 関数、またはシーケンスを参照する際に表関数結果表に影響を与えるような表関数があります。
- FENCED または NOT FENCED
- この節は、関数をデータベース・マネージャーのオペレーティング環境のプロセスまたはアドレス・スペースで実行しても「安全」か (NOT FENCED)、そうでないか (FENCED) を指定します。
関数が FENCED として登録されると、データベース・マネージャーは、 その内部リソース (データ・バッファーなど) を保護して、 その関数からアクセスされないようにします。 多くの関数は、FENCED または NOT FENCED のどちらかで実行するように選択することができます。 一般に、FENCED として実行される関数は、 NOT FENCED として実行されるものと同じようには実行されません。
注意:適切にコード化、検討、およびテストされていない関数に NOT FENCED を使用すると、データベースの整合性に危険を招く場合があります。このデータベース製品では、発生する可能性のある一般的な不注意による障害の多くに対して安全保護策が講じられていますが、NOT FENCED ユーザー定義関数が使用される場合には、完全な整合性を確保できません。LANGUAGE OLE または NOT THREADSAFE を指定した関数には、FENCED のみを指定できます (SQLSTATE 42613)。
関数が FENCED で NO SQL オプションを持っている場合、 AS LOCATOR 節は指定できません (SQLSTATE 42613)。
ユーザー定義関数を NOT FENCED として登録するには、SYSADM 権限、DBADM 権限、 または特殊権限 (CREATE_NOT_FENCED_ROUTINE) が必要です。
NOT FENCED 節を指定している場合は、LANGUAGE CLR ユーザー定義関数を作成できません (SQLSTATE 42601)。
- THREADSAFE または NOT THREADSAFE
- 関数を他のルーチンと同じプロセスで実行しても安全か (THREADSAFE)、
そうでないか (NOT THREADSAFE) を指定します。
関数が OLE 以外の LANGUAGE で定義される場合:
- 関数が THREADSAFE に定義されている場合には、 データベース・マネージャーは他のルーチンと同じプロセスで関数を呼び出すことができます。 一般に、スレッド・セーフにするには、関数はどのグローバルあるいは静的データ域をも使用してはなりません。 多くのプログラミング解説書には、スレッド・セーフ・ルーチンの作成に関する説明が含まれています。 FENCED および NOT FENCED 関数の両方が THREADSAFE になることが可能です。
- 関数が NOT THREADSAFE と定義される場合には、データベース・マネージャーが関数を他のルーチンと同じプロセスで同時に呼び出すことは決してありません。
FENCED 関数の場合、LANGUAGE が JAVAまたは CLR なら THREADSAFE がデフォルトです。 これ以外のすべての言語の場合は、NOT THREADSAFE がデフォルトです。 関数が LANGUAGE OLE に定義される場合には、THREADSAFE は指定できません (SQLSTATE 42613)。
NOT FENCED 関数の場合には、THREADSAFE がデフォルトです。 NOT THREADSAFE を指定することはできません (SQLSTATE 42613)。
- RETURNS NULL ON NULL INPUT または CALLED ON NULL INPUT
- このオプション節を使用すると、引数のいずれかが NULL 値の場合に、
外部関数を呼び出さないようにすることができます。
ユーザー定義関数がパラメーターなしで定義されている場合、
この NULL 引数条件は引き起こされることはないので、
この仕様のコーディング方法はそれほど重要ではなくなります。
RETURNS NULL ON NULL INPUT が指定されており、 表関数 OPEN が実行されるときに、関数の引数のいずれかが NULL 値の場合、 ユーザー定義関数は呼び出されません。 試行した表関数スキャンの結果は、空の表 (行のない表) になります。
CALLED ON NULL INPUT が指定されると、 引数が NULL 値か否かに関係なくユーザー定義関数が呼び出されます。 これは、NULL 値を戻す場合も、通常の (NULL 以外の) 値を戻す場合もあります。 ただし、NULL の引数値の有無のテストは UDF が行う必要があります。
値 NULL CALL は、後方互換性またはファミリーの互換性のために、 CALLED ON NULL INPUT の同義語として使うことができます。 同様に、NOT NULL CALL は、RETURNS NULL ON NULL INPUT の同義語として使用できます。
- READS SQL DATA、NO SQL、CONTAINS SQL
- 関数で実行できる SQL ステートメントの種別を指定します。データベース・マネージャーによって、この関数で実行される SQL ステートメントが、この指定と整合しているかどうかが検査されます。
各ステートメントの種別については、ルーチンおよびトリガー内で実行できる SQL ステートメントを参照してください。
デフォルトは READS SQL DATA です。
- READS SQL DATA
- データ・アクセス種別が READS SQL DATA、CONTAINS SQL、または NO SQL であるステートメントを関数で実行できるように指定します (SQLSTATE 38002 または 42985)。この関数では、データを変更する SQL ステートメントを実行できません (SQLSTATE 38003 または 42985)。
- NO SQL
- データ・アクセス種別が NO SQL である SQL ステートメントのみを関数で実行できるように指定します。ALLOW PARALLEL、EXECUTE ON ALL DATABASE PARTITIONS、および RESULT TABLE DISTRIBUTED 節がすべて指定されている場合、許容されるオプションは NO SQL のみとなります。
- CONTAINS SQL
- データ・アクセス種別が CONTAINS SQL または NO SQL である SQL ステートメントのみを関数で実行できるように指定します (SQLSTATE 38004 または 42985)。この関数では、データを読み取ったり変更したりする SQL ステートメントを実行できません (SQLSTATE 38003 または 42985)。
- STATIC DISPATCH
- このオプション節は、関数解決時に、データベース・サーバーが関数のパラメーターの静的タイプ (宣言済みタイプ) に基づいて関数を選択することを指定します。
- EXTERNAL ACTION または NO EXTERNAL ACTION
- 関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を
変更するアクションを取るかどうかを指定します。
外部アクションの例としては、メッセージの送信やファイルへのレコードの書き込みがあります。
デフォルトは EXTERNAL ACTION です。
- EXTERNAL ACTION
- 関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を変更するアクションを取ることを指定します。
外部アクションが指定された関数は、関数が並列タスクによって実行されると、不正確な結果を戻す場合があります。 例えば、初期呼び出しを受けるたびに注釈を送信する関数の場合、関数ごとに 1 つの注釈が送信されるのではなく、並列タスクごとに 1 回ずつ送信されることになります。 並列処理を正しく扱うことのできない関数については、DISALLOW PARALLEL 節を指定します。
- NO EXTERNAL ACTION
- 関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を 変更するアクションを取らないことを指定します。 データベース・マネージャーは、SQL ステートメントの最適化中に、この情報を使用します。
- NO SCRATCHPAD または SCRATCHPAD length
- この節はオプションであり、
この外部関数に対してスクラッチパッドを用意するか否かを指定するのに使用することができます。
(ユーザー定義関数を再入可能にすることを強くお勧めします。再入可能にすると、スクラッチパッドによってある呼び出しと次の呼び出しとの間に関数が「状態を保存する」手段が用意されます。)
- SCRATCHPAD を指定すると、ユーザー定義関数の最初の呼び出し時に、
その外部関数によって使用されるスクラッチパッドにメモリーが割り振られます。
ユーザー定義関数を呼び出すたびに、スクラッチパッドをアドレッシングする外部関数に追加の引数が渡されます。
スクラッチパッドには、次の特性があります。
- length を指定すると、スクラッチパッドのサイズをバイト単位で設定できます。この値は 1 から 32,767 の範囲で指定する必要があります (SQLSTATE 42820)。デフォルト値は 100 です。
- すべて X'00' に初期化されます。
- その有効範囲は、該当の SQL ステートメントです。
SQL ステートメントでの外部関数に対する参照ごとに 1 つのスクラッチパッドがあります。
したがって、以下のステートメントの UDFX 関数が、SCRATCHPAD キーワードを使用して定義されると、
2 つのスクラッチパッドが割り当てられます。
SELECT A.C1, B.C2 FROM TABLE (UDFX(:hv1)) AS A, TABLE (UDFX(:hv1)) AS B WHERE ... - スクラッチパッドは持続します。
スクラッチパッドは、ステートメントの実行開始時に初期化され、
ある呼び出しから次の呼び出しにスクラッチパッドの状態を保存するために、
外部表関数で使用することができます。
UDF に FINAL CALL キーワードも指定されている場合、
スクラッチパッドを変更することはありません。
また、特殊 FINAL 呼び出しがなされると、
スクラッチパッドに固定されていたすべてのリソースが解放されます。
NO FINAL CALL が指定またはデフォルト指定されている場合は、 データベース・サーバーが OPEN 呼び出しごとにスクラッチパッドを初期化し直すので、 外部表関数は CLOSE 呼び出し時に、 スクラッチパッドに固定されているすべてのリソースに対して終結処理を行います。FINAL CALL または NO FINAL CALL の判別、 およびスクラッチパッドの関連する動作は、重要な考慮事項です。 表関数が副照会または結合で使用されるときは、 ステートメントの実行中に複数の OPEN 呼び出しが生じ得るので、特に重要です。
- これは、外部関数が獲得するシステム・リソース (メモリーなどの) の中央点として使用することもできます。
関数は、最初の呼び出しでメモリーを獲得し、そのアドレスをスクラッチパッドに保管して、
後の呼び出しでそれを参照することができます。
(上で概説したように、FINAL CALL/NO FINAL CALL キーワードは、 スクラッチパッドの再初期化を制御するために使用され、 スクラッチパッドに固定されているリソースを外部表関数が解放する時期を指示します。)
- NO SCRATCHPAD を指定すると、 外部関数に対してスクラッチパッドは割り振られず、渡されません。
- SCRATCHPAD を指定すると、ユーザー定義関数の最初の呼び出し時に、
その外部関数によって使用されるスクラッチパッドにメモリーが割り振られます。
ユーザー定義関数を呼び出すたびに、スクラッチパッドをアドレッシングする外部関数に追加の引数が渡されます。
スクラッチパッドには、次の特性があります。
- FINAL CALL または NO FINAL CALL
- この節はオプションであり、
外部関数に対する最終呼び出し (および別個の最初の呼び出し) が行われるか否かを指定します。
この節は、スクラッチパッドが再初期化される時期も制御します。NO FINAL CALL が指定されている場合は、データベース・サーバーはオープン、
取り出しおよびクローズの 3 つのタイプの表関数の呼び出ししか行うことができません。
しかし、FINAL CALL が指定されている場合は、
オープン、取り出しおよびクローズに加えて、
表関数に対して最初の呼び出しと最終呼び出しを行うことができます。
外部表関数の場合、どのオプションが選択されたかにかかわらず、 呼び出しタイプ引数は常に存在します。
割り込みかトランザクションの終了のために最終呼び出しが行われると、 UDF は CLOSE カーソル以外の SQL ステートメントを発行できません (SQLSTATE 38505)。 こうした最終呼び出しの状況の場合には、「呼び出しタイプ」の引数に特殊値が渡されます。
FINAL CALL を LANGUAGE CPP と組み合わせて指定することはできません。
- DISALLOW PARALLEL または ALLOW PARALLEL EXECUTE ON ALL DATABASE PARTITIONS RESULT TABLE DISTRIBUTED
- 関数への単一の参照に対して、関数の呼び出しを並列化するかどうかを指定します。
- DISALLOW PARALLEL
- 関数を呼び出すたびに、関数が単一のデータベース・パーティションに対して呼び出されるように指定します。
- ALLOW PARALLEL EXECUTE ON ALL DATABASE PARTITIONS RESULT TABLE DISTRIBUTED
- 関数を呼び出すたびに、関数がすべてのデータベース・パーティションに対して呼び出されるように指定します。各データベース・パーティションで取得された結果セットの和集合が戻されます。 この関数は SQL ステートメントを実行できません (NO SQL 節も指定する必要があります)。
- NO DBINFO または DBINFO
- このオプション節は、データベース・サーバーにとって既知の特定の情報を、呼び出し時の追加の引数として関数に渡すか (DBINFO)、それとも渡さないか (NO DBINFO) を指定します。NO DBINFO がデフォルト値です。
DBINFO は、LANGUAGE OLE や PARAMETER TYLE NPSGENERIC ではサポートされません (SQLSTATE 42613)。
DBINFO を指定すると、以下の情報を含む構造が関数に渡されます。
- データベース名 - 現在接続されているデータベースの名前。
- アプリケーション ID - データベースへの接続ごとに確立された、ユニークなアプリケーション ID。
- アプリケーション許可 ID - アプリケーション実行時の許可 ID。この関数とアプリケーションとの中間でネストされている関数は無関係です。
- コード・ページ - データベースのコード・ページ。
- スキーマ名 - 外部表関数には適用されません。
- 表名 - 外部表関数には適用されません。
- 列名 - 外部表関数には適用されません。
- データベースのバージョンまたはリリース - 関数を呼び出すデータベース・サーバーのバージョン、リリース、および修正レベル。
- プラットフォーム - サーバーのプラットフォーム・タイプ。
- 表関数の結果の列番号 - この関数を参照しているステートメントによって使用される、結果の列番号の配列。この情報により、関数はすべての列値を戻す代わりに必要な列値だけを戻すことができます。
- データベース・パーティション番号 - 外部表関数が呼び出されたデータベース・パーティションの番号。単一データベース・パーティション環境では、この値は 0 になります。
- CARDINALITY integer
- この節はオプションで、
関数によって戻されると予想される行数の見積もりを最適化のために指定します。
値の有効範囲は 0 から 9,223,372,036,854,775,807 です。
表関数に対して CARDINALITY 節の指定がない場合、デフォルト値として有限の値が想定されます (この値は、RUNSTATS ユーティリティーによって統計が収集されていない表に対して想定される値と同じです)。
警告: 関数が無限のカーディナリティーを持っている (すなわち、行を返すために呼び出されるといつでも行を返し、「end-of-table」条件を返さない) 場合、end-of-table 条件が正しく機能することが必要である照会は、無限に実行されるので、中断させる必要があります。 このような照会の例としては、GROUP BY 節や ORDER BY 節を含む照会があります。 この理由により、無限のカーディナリティーを持つ UDF の記述は推奨されません。
- TRANSFORM GROUP group-name
- 関数を呼び出す際のユーザー定義の構造化タイプのトランスフォーメーションに使用するトランスフォーム・グループを指定します。 関数定義にパラメーター・データ・タイプとしてユーザー定義の構造化タイプが含まれている場合、 トランスフォームが必要になります。 この節が指定されない場合には、デフォルトのグループ名 Db2_FUNCTION が使用されます。 参照された構造化タイプに、指定した (またはデフォルトの) グループ名が定義されていない場合には、 エラーになります (SQLSTATE 42741)。 指定した group-name または構造化タイプに必須の FROM SQL 変換関数が定義されていない場合には、 エラーになります (SQLSTATE 42744)。
- INHERIT SPECIAL REGISTERS
- このオプション節は、関数の更新可能な特殊レジスターが、
呼び出しステートメントの環境からの初期値を継承することを指定します。
カーソルの選択ステートメントで呼び出される関数の場合、
初期値はカーソルがオープンした際の環境から継承します。
ネストされたオブジェクト (例えば、トリガーまたはビュー) に呼び出されるルーチンの場合、
初期値は (オブジェクト定義から継承するのではなく) ランタイム環境から継承します。
特殊レジスターに対する変更が、関数の呼び出し側に戻されることはありません。
更新不能の特殊レジスター (日時特殊レジスターなど) は、 現在実行中のステートメントのプロパティーを反映するので、デフォルト値に設定されます。
- NOT SECURED または SECURED
- 関数が行および列のアクセス制御に対してセキュアであるどうかを指定します。デフォルトは NOT SECURED です。
- NOT SECURED
- 関数がセキュアであると見なされないことを示します。この関数が呼び出されるとき、この関数の引数は、列マスクが有効で列レベルのアクセス制御がその表でアクティブ化されている列を参照できません (SQLSTATE 428HA)。この規則は、ステートメントのどこかで呼び出されるセキュアではないユーザー定義関数に適用されます。
- SECURED
- 関数がセキュアであると見なされることを示します。関数は、行権限または列マスクで参照されるときに、セキュアでなければなりません (SQLSTATE 428H8、SQLCODE -20470)。
- STAY RESIDENT NO
- 関数のためにロードしたライブラリーを関数の終了後にメモリー内に残さないことを指定します。この節は以下の場合に無視されます。
- NOT FENCED 節を指定した場合。
- LANGUAGE オプションを JAVA または CLR に設定した場合。
規則
- パーティション・データベース環境では、 外部ユーザー定義関数またはメソッドでの SQL の使用はサポートされていません (SQLSTATE 42997)。
- 索引拡張を定義するには、NO SQL として定義されたルーチンしか使用できません (SQLSTATE 428F8)。
- 関数が SQL を許可する場合、外部プログラムは、 フェデレーテッド・オブジェクトへのアクセスを試行してはなりません (SQLSTATE 55047)。
- 表アクセスの制限 関数が READS SQL DATA に定義されている場合には、関数のいかなるステートメントも、 関数を呼び出したステートメントによって変更されている表にはアクセスできません (SQLSTATE 57053)。 例えば、 ユーザー定義関数 BONUS() が READS SQL DATA に定義されているとします。 ステートメント UPDATE EMPLOYEE SET SALARY = SALARY + BONUS(EMPNO) が呼び出される場合、 BONUS 関数の SQL ステートメントは、EMPLOYEE 表からの読み取りを行えません。
注
- ユーザー定義関数のパラメーターのデータ・タイプを選択する場合は、
入力値に影響を与えるプロモーションの規則を考慮してください。
例えば、入力値として使用できる定数のデータ・タイプは、
予期される以外の組み込みデータ・タイプである可能性があり、さらには、
予期されるデータ・タイプにプロモートできない場合があります。
プロモーションの規則に従って、
一般にパラメーターには次のデータ・タイプを使用するようにしてください。
- SMALLINT ではなく INTEGER
- REAL ではなく DOUBLE
- CHAR ではなく VARCHAR
- GRAPHIC ではなく VARGRAPHIC
- プラットフォーム間での UDF の移植性を保つためには、以下のデータ・タイプの使用をお勧めします。
- FLOAT ではなく DOUBLE または REAL
- NUMERIC ではなく DECIMAL
- LONG VARCHAR ではなく CLOB (または BLOB)
- まだ存在していないスキーマ名を用いて関数を作成すると、 ステートメントの許可 ID に IMPLICIT_SCHEMA 権限がある場合に限り、 そのスキーマが暗黙に作成されます。 スキーマの所有者は SYSIBM になります。スキーマに対する CREATEIN 特権が PUBLIC に付与されます。
- NOT FENCED として定義される Java ルーチンは、FENCED THREADSAFE として定義されているかのように呼び出されます。
- 特権: 関数の定義者は、関数に対する WITH GRANT OPTION 付きの EXECUTE 特権と、関数をドロップする権利を常に与えられます。SQL ステートメントで関数が使用されるとき、関数の定義者は、その関数によって使用されるすべてのパッケージに対する EXECUTE 特権か、EXECUTEIN 特権か、パッケージが含まれるスキーマに対するスキーマ DATAACCESS 権限を持っている必要があります。
- デフォルト値の設定: デフォルト値で定義された関数のパラメーターは、この関数の呼び出し時に、それらのデフォルト値に設定されますが、この関数の呼び出し時に、値が対応する引数に提供されていないか、または DEFAULT で指定されている場合にのみ、このように設定されます。
- 代替構文: このデータベース製品の以前のバージョンおよび他のデータベース製品との互換性のために、以下の代替の構文がサポートされています。これらの代替は非標準であり、使用すべきではありません。
- PARAMETER STYLE SQL の代わりに PARAMETER STYLE Db2SQL を指定できます。
- DETERMINISTIC の代わりに NOT VARIANT を指定できます。
- NOT DETERMINISTIC の代わりに VARIANT を指定できます。
- CALLED ON NULL INPUT の代わりに NULL CALL を指定できます。
- RETURNS NULL ON NULL INPUT の代わりに NOT NULL CALL を指定できます。
- Db2GENERAL の代わりに Db2GENRL を指定できます。
以下の構文はデフォルトの振る舞いとして受け入れられます。- ASUTIME NO LIMIT
- NO COLLID
- PROGRAM TYPE SUB
- Unicode データベースでの CCSID UNICODE
- PARAMETER CCSID UNICODE が指定されていない場合、非 Unicode データベース内での CCSID ASCII
- セキュア関数の作成: 通常、SECADM 権限を持つユーザーは、トリガーおよび関数などのデータベース・オブジェクトを作成する特権を持ちません。
一般的に、このユーザーは、関数によってアクセスされるデータを検査し、それがセキュアであることを確認してから、セキュアなユーザー定義関数の作成に必要な特権を現在保持しているユーザーに対して、CREATE_SECURE_OBJECT 権限を付与します。
関数の作成後、SECADM 権限を持つユーザーは、関数所有者の CREATE_SECURE_OBJECT 権限を取り消します。
SECURED 属性は、ユーザー定義関数に対するすべての変更についての変更制御監査プロシージャーをユーザーが確立したことを宣言する、アサーションとして見なされます。 データベース・マネージャーは、その制御監査プロシージャーが、すべての後続の ALTER FUNCTION ステートメントまたは外部パッケージに対する変更に有効であると見なします。
- セキュア関数での他のユーザー定義関数の呼び出し: セキュア・ユーザー定義関数がその他のユーザー定義関数を呼び出す場合、データベース・マネージャーは、それらのネストしたユーザー定義関数に SECURED 属性があるかどうかを妥当性検査しません。 それらのネストした関数が機密データにアクセスできる場合、SECADM 権限のあるユーザーは、それらの関数が機密データへのアクセスを許可されていることと、それらの関数へのすべての変更に変更制御監査プロシージャーが確立されていることを確認する必要があります。
- セキュア属性の変更 (SECURED から NOT SECURED およびその逆) を伴う既存関数の 置換: 関数に依存するパッケージおよび動的キャッシュ SQL ステートメントは、無効になる可能性があります。 これは、行レベルまたは列レベルのアクセス制御がアクティブになっている表が関係するステートメントでは、セキュア属性がアクセス・パスの選択に影響を及ぼすためです。
- EXTERNAL ACTION 関数: EXTERNAL ACTION 関数が最外部の選択リスト以外で呼び出された場合、関数が呼び出される回数は使用されるアクセス・プランによって異なるため、結果が予測不能になります。
例
- 例 1: 以下の例では、テキスト管理システムにおいて既知の各文書の 1 つの文書 ID 列からなる行を戻す表関数を登録しています。最初のパラメーターは指定された対象領域をマッチングし、
2 番目パラメーターには指定されたストリングが入ります。
単一セッションのコンテキスト内では UDF は常に同じ表を戻すため、 UDF は DETERMINISTIC として定義されています。 DOCMATCH からの出力を定義する RETURNS 節に注意してください。 それぞれの表関数に対して、FINAL CALL を指定する必要があります。 さらに、この表関数は並列して実行できないので、 DISALLOW PARALLEL キーワードが追加されています。 DOCMATCH の出力のサイズは大きく変動しますが、 データベース・オプティマイザーにとって有用な CARDINALITY 20 が代表値として指定されています。
CREATE FUNCTION DOCMATCH (VARCHAR(30), VARCHAR(255)) RETURNS TABLE (DOC_ID CHAR(16)) EXTERNAL NAME '/common/docfuncs/rajiv/udfmatch' LANGUAGE C PARAMETER STYLE SQL NO SQL DETERMINISTIC NO EXTERNAL ACTION NOT FENCED SCRATCHPAD FINAL CALL DISALLOW PARALLEL CARDINALITY 20 - 例 2: 以下の例では、
Microsoft Exchange のメッセージのメッセージ・ヘッダー情報と、部分的なメッセージ・テキストの検索に使用する OLE 表関数を登録しています。
CREATE FUNCTION MAIL() RETURNS TABLE (TIMERECEIVED DATE, SUBJECT VARCHAR(15), SIZE INTEGER, TEXT VARCHAR(30)) EXTERNAL NAME 'tfmail.header!list' LANGUAGE OLE PARAMETER STYLE SQL NOT DETERMINISTIC FENCED CALLED ON NULL INPUT SCRATCHPAD FINAL CALL NO SQL EXTERNAL ACTION DISALLOW PARALLEL
