CREATE FUNCTION (SQL スカラー、表、行) ステートメント
CREATE FUNCTION (SQL スカラー、表、または行) ステートメントは、ユーザー定義の SQL スカラー、表、または行関数を定義するのに使用されます。
スカラー関数 は、呼び出されるたびに 1 つの値を戻し、 SQL 式が有効な個所であればどこでも有効です。 表関数 は、FROM 節で使用でき、表を戻します。 行関数 は、トランスフォーム関数として使用でき、行を戻します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- データベースに対する IMPLICIT_SCHEMA 権限 (関数の暗黙または明示のスキーマ名が存在しない場合)
- スキーマに対する CREATEIN 特権 (関数のスキーマ名が既存のスキーマを指している場合)
- スキーマに対する SCHEMAADM 権限 (関数のスキーマ名が存在する場合)
- DBADM 権限
- その表、ビュー、またはニックネームに対する CONTROL 特権
- その表、ビュー、またはニックネームに対する SELECT 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS 権限
- データベースに対する DATAACCESS 権限
PUBLIC 以外のグループ特権は、 CREATE FUNCTION ステートメントで指定された表やビューに対しては考慮されません。
このニックネームで示されている表またはビューのデータ・ソースの許可要件は、 関数が呼び出される時に適用されます。 接続の許可 ID は、別のリモート許可 ID へマップできます。
ステートメントの許可 ID によって保持される特権には、関数本体で指定される SQL ステートメントの呼び出しに必要なすべての特権も含まれていなければなりません。
既存の関数を置換するには、ステートメントの許可 ID が既存の関数の所有者でなければなりません (SQLSTATE 42501)。
SECURED オプションを指定する場合は、 ステートメントの許可 ID に、SECADM または CREATE_SECURE_OBJECT 権限が含まれている必要があります (SQLSTATE 42501)。
構文
- 1 OUT and INOUT are valid only if RETURNS specifies a scalar result and the SQL-function-body is a compound SQL (compiled) statement.
- 2 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
- 3 DB2SECURITYLABEL is the built-in distinct type that must be used to define the row security label column of a protected table.
- 4 Valid only for compiled scalar function definition and an inlined table function definition. A compiled scalar function defined as MODIFIES SQL DATA can only be used as the only element on the right side of an assignment statement that is within a compound SQL (compiled) statement.
- 5 Valid only if RETURNS specifies a scalar result (data-type2)
- 6 The following apply to the specification of a compound SQL (compiled) statement: a) Must be used if the parameter data types or returned data types include a row type, array type, or cursor type; b) Must be used if the RETURNS TABLE clause specifies any syntax other than a column-list; c) Not supported if RETURNS ROW is specified; d) Not supported when defining a table function in a partitioned database environment.
説明
- 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)、および DECFLOAT(16) と DECFLOAT(34) は、それぞれ同じタイプと見なされます。 緩やかに型付けされた特殊タイプをパラメーターに指定した場合、その特殊タイプは、特殊タイプのソース・タイプと同じデータ・タイプと見なされます。 Unicode データベースの場合には、CHAR(13) と GRAPHIC(8) は、それぞれ同じタイプと見なされます。 さらに、DECIMAL と NUMERIC などのように、 この目的で複数のタイプが同じタイプとして扱われることがあります。 シグニチャーが重複していると、エラー (SQLSTATE 42723) を戻します。
パラメーターのデータ・タイプが Boolean データ・タイプ、配列タイプ、カーソル・タイプ、または行タイプの場合、SQL 関数本体はコンパウンド SQL (コンパイル済み) ステートメント内でのみパラメーターを参照できます (SQLSTATE 428H2)。
- イン | アウト | inout
- パラメーターのモードを指定します。 関数によってエラーが戻される場合、OUT パラメーターは未定義で、INOUT パラメーターは未変更です。 デフォルトは IN です。
- IN
- パラメーターを関数の入力パラメーターとして指定します。 制御が戻されると、関数内のパラメーターに加えられたどのような変更も、呼び出し側コンテキストで利用できません。 OUT
- パラメーターを関数の出力パラメーターとして指定します。 INOUT
- パラメーターを、関数の入力および出力パラメーターの両方として指定します。
parameter-name - パラメーターの名前を指定します。 この名前は、パラメーター・リスト内の他のすべての parameter-name と同じにすることはできません (SQLSTATE 42734)。 data-type1
- パラメーターのデータ・タイプを指定します。
- 組み込みタイプ (built-in-type)
- 組み込みデータ・タイプを指定します。 表に指定できない BOOLEAN および CURSOR を除く各組み込みデータ・タイプの詳細な説明については、
CREATE TABLE
を参照してください。- BOOLEAN
- Boolean を示します。
- CURSOR
- 基礎となるカーソルへの参照を示します。
- アンカー・データ・タイプ
- パラメーターのデータ・タイプを定義するために使用される別のオブジェクトを指定します。 アンカー・オブジェクトのデータ・タイプは、data-type1 として明示的に許可されている任意のデータ・タイプにすることができます。 アンカー・オブジェクトのデータ・タイプには、データ・タイプを直接指定する際に (行の場合は行タイプを作成する際に) 適用されるのと同じ制限があります。
- ANCHOR DATA TYPE TO
- データ・タイプの指定にアンカー・データ・タイプを使用することを示します。
- variable-name1
- グローバル変数を指定します。 グローバル変数のデータ・タイプが、parameter-name のデータ・タイプとして使用されます。 table-name.column-name
- 既存の表またはビューの列名を指定します。 列のデータ・タイプが、parameter-name のデータ・タイプとして使用されます。
- ROW OF table-name または view-name
- table-name で識別される表、または view-name で識別されるビューの列名および列データ・タイプを基にした名前とデータ・タイプを含むフィールドの行になるように指定します。 parameter-nameのデータ・タイプ は、名前のない行タイプです。
- 行の終わり cursor-variable-name
- cursor-variable-name で識別されるカーソル変数のフィールド名およびフィールド・データ・タイプを基にした名前とデータ・タイプを含めて、フィールドの行を指定します。 指定するカーソル変数は、以下のいずれかのエレメントでなければなりません (SQLSTATE 428HS)。
- 厳密に型付けされたカーソル・データ・タイプのグローバル変数
- すべての結果列が名前指定されている select-statement を指定した CONSTANT 節を使用して作成または宣言された、緩やかに型付けされたカーソル・データ・タイプのグローバル変数
- 配列タイプ名 (array-type-name)
- ユーザー定義の配列タイプの名前を指定します。 array-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、配列タイプは解決されます。
- カーソル・タイプ名
- カーソル・タイプの名前を指定します。 cursor-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、カーソル・タイプは解決されます。
- 特殊タイプ名 (distinct-type-name)
- 特殊タイプの名前を指定します。 パラメーターの長さ、精度、および位取りは、それぞれ特殊タイプのソース・タイプの長さ、精度、および位取りになります。 特殊タイプのパラメーターは、特殊タイプのソース・タイプとして受け渡されます。 distinct-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、特殊タイプは解決されます。
- REF (タイプ名)
- 有効範囲なしで参照タイプを指定します。 指定される type-name は、 ユーザー定義構造化タイプを識別するものでなければなりません (SQLSTATE 428DP)。 システムがパラメーターまたは結果の有効範囲を推測することはしません。 関数本体では、最初に参照タイプをキャストして有効範囲を指定してからでなければ、 間接参照操作は使用できません。 同様に、SQL 関数により戻される参照も、 最初にキャストしてこれに有効範囲を指定してからでなければ間接参照操作は使用できません。 タイプ名がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、type-name は解決されます。
- 行 (ROW) 型名
- ユーザー定義の行タイプの名前を指定します。 パラメーターのフィールドは、行タイプのフィールドです。 row-type-name がスキーマ名なしで指定された場合、行タイプは SQL パスでスキーマを検索することによって解決されます。
- 構造化タイプ名
- ユーザー定義の構造化タイプの名前を指定します。 structured-type-name がスキーマ名なしで指定される場合、SQL パスでスキーマを検索することにより、構造化タイプは解決されます。
- 組み込みデータ・タイプを指定します。 表に指定できない BOOLEAN および CURSOR を除く各組み込みデータ・タイプの詳細な説明については、
- DEFAULT
- パラメーターのデフォルト値を指定します。 デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。 デフォルトとして指定できる特殊レジスターは、
列のデフォルトに指定できる特殊レジスターと同じです (CREATE TABLE ステートメントの default-clause を参照)。 他の特殊レジスターは、式を使用することによってデフォルトとして指定できます。
この式は、『式』で説明されているいずれかのタイプの式とすることができます。 デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、対応する引数はプロシージャーの呼び出し時に省略できません。 expression の最大サイズは 64K バイトです。
デフォルトの式は、SQL データを変更してはなりません (SQLSTATE 428FL または SQLSTATE 429BL)。 式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません (SQLSTATE 42821)。
以下の状況では、デフォルトを指定できません。- INOUT または OUT パラメーターの場合 (SQLSTATE 42601)
- ARRAY、ROW、または CURSOR タイプのパラメーターの場合 (SQLSTATE 429BB)
- RETURNS ROW または PREDICATES 節も指定されている関数定義のパラメーターの場合 (SQLSTATE 42613)
- パラメーターのモードを指定します。 関数によってエラーが戻される場合、OUT パラメーターは未定義で、INOUT パラメーターは未変更です。 デフォルトは IN です。
- RETURNS
- これは必須の節であり、関数の出力のタイプを指定します。
関数の出力のデータ・タイプが Boolean データ・タイプ、配列タイプ、カーソル・タイプ、または行タイプの場合、SQL 関数本体はコンパウンド SQL (コンパイル済み) ステートメントでなければなりません (SQLSTATE 428H2)。
- data-type2
- 出力のデータ・タイプを指定します。
このステートメントには、 前述の関数パラメーター data-type1 で説明した SQL 関数のパラメーターに関するものとまったく同じ考慮事項が当てはまります。
- ROW
- 関数の出力が単一行であることを指定します。 関数が複数の行を戻した場合は、エラーが戻されます (SQLSTATE 21505)。この形式の行関数は、構造化タイプ用のトランスフォーム関数としてのみ使用できます (1 つの構造化タイプをパラメーターとして持ち、組み込みデータ・タイプのみを戻す)。
- カラムリスト
- ROW 関数で返される列名およびデータ・タイプのリスト。 column-list には、少なくとも 2 つの列が含まれていなければなりません (SQLSTATE 428F0)。
- column-name
- この列の名前を指定します。 名前を修飾することはできず、リストの複数の列に対して同じ名前を使用することはできません。 data-type3
- 列のデータ・タイプを指定します。
SQL 関数のパラメーターによりサポートされていれば、どのデータ・タイプでも構いません。
前述の関数パラメーター data-type1 で説明した SQL 関数のパラメーターに関するものと同じ考慮事項が当てはまります。 しかし、data-type3 は anchored-data-type、array-type-name、cursor-type-name、および row-type-name をサポートしません。
- ROW 関数で返される列名およびデータ・タイプのリスト。 column-list には、少なくとも 2 つの列が含まれていなければなりません (SQLSTATE 428F0)。
- テーブル
- 関数の出力が表であることを指定します。
- カラムリスト
- TABLE 関数で返される列名およびデータ・タイプのリスト。
- column-name
- この列の名前を指定します。 名前を修飾することはできず、リストの複数の列に対して同じ名前を使用することはできません。 data-type3
- 列のデータ・タイプを指定します。
SQL 関数のパラメーターによりサポートされていれば、どのデータ・タイプでも構いません。
前述の関数パラメーター data-type1 で説明した SQL 関数のパラメーターに関するものと同じ考慮事項が当てはまります。 しかし、data-type3 は anchored-data-type、array-type-name、cursor-type-name、および row-type-name をサポートしません。
行 (ROW) 型名 - 列リストを派生させるために使用するフィールドが入った行タイプを指定します。 行タイプのフィールド名は、列名として使用されます。
- anchored-row-data-type
- 返される表の列として使用する、別のオブジェクトからの行情報を指定します。
- ANCHOR DATA TYPE TO
- データ・タイプの指定にアンカー・データ・タイプを使用することを示します。 variable-name
- グローバル変数を指定します。 参照される変数のデータ・タイプは、行タイプでなければなりません。
- ROW OF table-name または view-name
- table-name で識別される表、または view-name で識別されるビューの列名および列データ・タイプを基にした名前とデータ・タイプを含むフィールドの行になるように指定します。 アンカー・オブジェクト列のデータ・タイプには、data-type3 に適用されるのと同じ制限があります。
- 行の終わり cursor-variable-name
- cursor-variable-name で識別されるカーソル変数のフィールド名およびフィールド・データ・タイプを基にした名前とデータ・タイプを含めて、フィールドの行を指定します。 指定するカーソル変数は、以下のいずれかのオブジェクトでなければなりません (SQLSTATE 428HS)。
- 厳密に型付けされたカーソル・データ・タイプのグローバル変数
- すべての結果列が名前指定されている select-statement を指定した CONSTANT 節を使用して作成または宣言された、緩やかに型付けされたカーソル・データ・タイプのグローバル変数
- array-type-name のエレメント
- 列リストを派生させるために使用するエレメント・データ・タイプが入った配列タイプを指定します。 array-type-name が、行タイプのエレメントを持つ配列タイプを指定する場合、行タイプのフィールド名は列名として使用されます。 array-type-name が、行タイプではないエレメントを持つ配列タイプを指定する場合、単一の結果列名は COLUMN_VALUE になります。
- TABLE 関数で返される列名およびデータ・タイプのリスト。
- 出力のデータ・タイプを指定します。
- built-in-type
- 組み込みデータ・タイプの説明については、『CREATE TABLE』を参照してください。
- SPECIFIC 特定名
- 定義する関数のインスタンスに対する固有名を指定します。 この特定名は、この関数をソース関数として使用する場合、
この関数をドロップする場合、またはこの関数にコメントを付ける場合に使用することができます。 これは、関数の呼び出しには使用できません。 specific-name の非修飾形式は SQL ID です。 修飾形式は、schema-name の後にピリオドと SQL ID が続きます。 暗黙または明示の修飾子も含め、その名前が、
アプリケーション・サーバーに存在する別の関数インスタンスを識別するものであってはなりません。
そうでない場合は、エラーになります (SQLSTATE 42710)。
specific-name は、既存の function-name (関数名) と同じでも構いません。
修飾子を指定しない場合、function-name に使用された修飾子が使用されます。 修飾子を指定する場合は、 function-name の明示または暗黙の修飾子と同じでなければなりません。 そうでない場合は、エラーになります (SQLSTATE 42882)。
specific-name の指定がない場合、固有名がデータベース・マネージャーによって生成されます。 生成される固有名は、SQL の後に文字タイム・スタンプが続く名前です (SQLyymmddhhmmssxxx)。
- LANGUAGE SQL
- 関数が SQL を使用して書かれていることを指定します。
- PARAMETER CCSID
- 関数とやり取りされるすべてのストリング・データに使用されるコード化スキームを指定します。 PARAMETER CCSID 節を指定しない場合のデフォルトは、
Unicode データベースでは PARAMETER CCSID UNICODE、
他のすべてのデータベースでは PARAMETER CCSID ASCII になります。
- ASCII
- ストリング・データがデータベース・コード・ページでエンコードされることを指定します。 データベースが Unicode データベースの場合は、 PARAMETER CCSID ASCII を指定することはできません (SQLSTATE 56031)。
- ユニコード
- 文字データは UTF-8 で記述され、GRAPHIC データは UCS-2 で記述されることを指定します。 データベースが Unicode データベースでない場合は、 PARAMETER CCSID UNICODE は指定できません (SQLSTATE 56031)。
- DETERMINISTIC または NOT DETERMINISTIC
- この節は任意指定で、特定の引数値に対して関数が常に同じ結果を戻すか (DETERMINISTIC)、それとも状態値に依存して関数の結果が影響を受けるか (NOT DETERMINISTIC) を指定します。 つまり DETERMINISTIC 関数は、同一の入力で連続で呼び出しが行われたとき、常に同じ表を返します。 NOT DETERMINISTIC を指定すると、 同じ入力によって常に同じ結果が生じることを利用した最適化ができなくなります。
- EXTERNAL ACTION または NO EXTERNAL ACTION
- 関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を
変更するアクションを取るかどうかを指定します。 外部アクションの例としては、メッセージの送信やファイルへのレコードの書き込みがあります。 デフォルトは EXTERNAL ACTION です。
- EXTERNAL ACTION
- 関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を変更するアクションを取ることを指定します。
- NO EXTERNAL ACTION
- 関数が、データベース・マネージャーによって管理されていないオブジェクトの状態を 変更するアクションを取らないことを指定します。 データベース・マネージャーは、SQL ステートメントの最適化中に、この情報を使用します。
- READS SQL DATA、CONTAINS SQL、または MODIFIES SQL DATA
- 関数で実行できる SQL ステートメントの種別を指定します。 データベース・マネージャーによって、この関数で実行される SQL ステートメントが、この指定と整合しているかどうかが検査されます。
各ステートメントの種別については、 ルーチンおよびトリガーで実行できる SQL ステートメントを参照してください。
- READS SQL DATA
- データ・アクセス種別が READS SQL DATA、CONTAINS SQL、または NO SQL であるステートメントを関数で実行できるように指定します。 この関数では、データを変更する SQL ステートメントを実行できません (SQLSTATE 42985)。 これがデフォルトです。
- CONTAINS SQL
- この関数が、データ・アクセス種別が CONTAINS SQLの SQL ステートメントのみを実行できるように指定します。 この関数では、データを読み取ったり変更したりする SQL ステートメントを実行できません (SQLSTATE 42985)。
- MODIFIES SQL DATA
- どの関数でもサポートされないステートメント以外のすべての SQL ステートメントをこの関数で実行できるように指定します。
- ALLOW PARALLEL または DISALLOW PARALLEL
- この節は、UDF を並列化できるかどうか、つまり 1 度の UDF の呼び出しで UDF の複数のインスタンス (通常はパーティションあたり 1 つのインスタンス) を並行して実行できるかどうかを指定します。 並列化すると通常は全体的にパフォーマンスが向上しますが、並列化できるのは以下の条件をすべて満たしている場合だけです。
- CONTAINS SQL 節が指定されている。
- UDF のすべての呼び出しが、互いに完全に独立している。
DISALLOW PARALLELがデフォルトです。
- STATIC DISPATCH
- このオプション節は、関数解決時に、関数のパラメーターの静的タイプ (宣言済みタイプ) に基づいて関数を選択することを指定します。
- CALLED ON NULL INPUT
- この節は、なんらかの引数が NULL 値であるかどうかにかかわりなく、
関数が呼び出されることを指定します。 これは、NULL 値を戻す場合も、NULL 以外の値を戻す場合もあります。 NULL の引数値の有無のテストはユーザー定義関数が行う必要があります。
CALLED ON NULL INPUT の代わりに NULL CALL という句を使用できます。
- INHERIT SPECIAL REGISTERS
- このオプション節は、関数の更新可能な特殊レジスターが、
呼び出しステートメントの環境からの初期値を継承するよう指示します。 カーソルの選択ステートメントに呼び出された関数の場合、
初期値はカーソルがオープンした際の環境から継承します。 ネストされたオブジェクト (例えば、トリガーまたはビュー) に呼び出されるルーチンの場合、
初期値はランタイム環境 (オブジェクト定義ではない) から継承します。
特殊レジスターに対する変更が、関数の呼び出し元に戻されることはありません。
一部の特殊レジスター (日時特殊レジスターなど) は、 現在実行中のステートメントのプロパティーを反映するので、呼び出し元からの継承は行われません。
- PREDICATES
- この関数を使用する述部の場合、この節は索引拡張を活用できることを示し、
オプションの SELECTIVITY 節を使用して述部の検索条件を指定できます。 PREDICATES 節が指定された場合、
関数は NO EXTERNAL ACTION を指定した DETERMINISTIC として定義しなければなりません (SQLSTATE 42613)。 PREDICATES 節が指定されており、
データベースが Unicode データベースでない場合は、
PARAMETER CCSID UNICODE は指定できません (SQLSTATE 42613)。 SQL-function-body がコンパウンド SQL (コンパイル済み) ステートメントである場合は、PREDICATES を指定できません (SQLSTATE 42613)。
- 述部指定
- 述部指定の詳細については、
CREATE FUNCTION (外部スカラー)
を参照してください。
- 述部指定の詳細については、
- INHERIT ISOLATION LEVEL WITHOUT LOCK REQUEST または INHERIT ISOLATION LEVEL WITH LOCK REQUEST
- 関数が呼び出し元のステートメントの分離レベルを継承している場合に、
ロック要求をステートメントの分離レベルに関連付けることができるかどうかを指定します。 デフォルトは INHERIT ISOLATION LEVEL WITHOUT LOCK REQUEST です。
- INHERIT ISOLATION LEVEL WITHOUT LOCK REQUEST
- 関数が呼び出し元のステートメントの分離レベルを継承している場合に、 指定した isolation-clause (分離節) の一部として lock-request-clause (ロック要求節) が含まれている SQL ステートメントの コンテキストでそのメソッドを呼び出すことができません (SQLSTATE 42601)。
- INHERIT ISOLATION LEVEL WITH LOCK REQUEST
- 関数が呼び出し元のステートメントの分離レベルを継承している場合に、 指定した lock-request-clause (ロック要求節) をメソッドが継承することを指定します。
- SQL-function-body
- 関数の本体を指定します。 パラメーター名を SQL-function-body で参照することができます。 あいまい参照を避けるため、パラメーター名は関数名で修飾できます。
RETURN ステートメントについては、『RETURN ステートメント』を参照してください。
コンパウンド SQL (コンパイル済み) については、『コンパウンド SQL (コンパイル済み) ステートメント』を参照してください。
コンパウンド SQL (インライン化) については、『コンパウンド SQL (インライン化) ステートメント』を参照してください。
- NOT SECURED または SECURED
- 関数が行および列のアクセス制御に対してセキュアであるどうかを指定します。 デフォルトは NOT SECURED です。
- NOT SECURED
- 関数がセキュアであると見なされないことを示します。 この関数が呼び出されるとき、この関数の引数は、列マスクが有効で列レベルのアクセス制御がその表でアクティブ化されている列を参照できません (SQLSTATE 428HA)。 この規則は、ステートメントのどこかで呼び出されるセキュアではないユーザー定義関数に適用されます。
- SECURED
- 関数がセキュアであると見なされることを示します。 関数は、行権限または列マスクで参照されるときに、セキュアでなければなりません (SQLSTATE 428H8)。
ルール
- アンカー・データ・タイプの使用: アンカー・データ・タイプは次のオブジェクトを参照できません (SQLSTATE 428HS): ニックネーム、型付き表、型付きビュー、式ベースの索引に関連付けられた統計ビュー、宣言済み一時表、緩やかに型付けされたカーソルに関連付けられた行定義、データベース・コード・ページまたはデータベース照合とは異なるコード・ページまたは照合を使用するオブジェクト。
- カーソルおよび行タイプの使用: カーソル・タイプか行タイプをパラメーターに使用するか、またはカーソル・タイプか行タイプを戻す関数は、コンパウンド SQL (コンパイル済み) ステートメント内からのみ呼び出しが可能です (SQLSTATE 428H2)。
- 表アクセスの制限: 関数が READS SQL DATA に定義されている場合には、関数のいかなるステートメントも、
関数を呼び出したステートメントによって変更されている表にはアクセスできません (SQLSTATE 57053)。 例えば、 ユーザー定義関数 BONUS() が READS SQL DATA に定義されているとします。 ステートメント UPDATE EMPLOYEE SET SALARY = SALARY + BONUS(EMPNO) が呼び出される場合、
BONUS 関数の SQL ステートメントは、EMPLOYEE 表からの読み取りを行えません。
ネストされた CALL ステートメントが MODIFIES SQL DATA で定義された関数に含まれている場合、 この関数によって (関数定義またはこの関数を呼び出すステートメントによって) 変更される表への読み取りアクセスは許可されません (SQLSTATE 57053)。
- パーティション・データベース環境での使用:
- パーティション・データベース環境で、コンパウンド SQL (コンパイル済み) ステートメントを使用して定義されたスカラー関数は、割り当てステートメントの右側でのみ参照でき、関数参照を式の一部にすることはできません。 こうした割り当てステートメントをコンパウンド SQL (インライン化) ステートメントに含めることはできません。
- パーティション・データベース環境で、CONTAINS SQL として定義されているコンパウンド SQL (コンパイル済み) ステートメントを使用して定義されたスカラー関数については、さらに次の制約事項があります: 明示的なステートメント実行を行わず、すべてのプロシージャー・ロジックが、SQL ステートメントの実行を必要とすることなくサポートされなければなりません。
- パーティション・データベース環境で、READS SQL として定義されているコンパウンド SQL (コンパイル済み) ステートメントを使用して定義されたスカラー関数は、常にコーディネーター・エージェントで強制的に実行されます。 また、UPDATE すてステートメントおよび DELETE ステートメントのコンテキストでは使用できません。
注
- 関数本体内での関数呼び出しの解決は、 CREATE FUNCTION ステートメントに対して有効な SQL パスに従って実行され、 関数が作成された後も変更されません。
- SQL 関数に、何らかの日付または時刻の特殊レジスターへの参照が複数含まれている場合、 すべての参照は同じ値を戻します。 そして、関数を呼び出したステートメントでのレジスター呼び出しにより戻される値と同じになります。
- SQL 関数の本体には、 これ自体または他の関数やこれを呼び出すメソッドに対する再帰呼び出しを組み込むことはできません。 そのような関数は、呼び出しの対象として存在できないからです。
- SQL 関数本体で参照されているオブジェクトが存在しないか、無効とマークされている場合、または定義者がオブジェクトにアクセスする特権を一時的に持っていない場合でも、データベース構成パラメーター auto_reval が DISABLED に設定されていなければ、SQL 関数は正常に作成されます。 この SQL 関数は、無効とマークを付けられ、次回呼び出されたときに再度有効化されます。
- 関数またはメソッドを作成するすべてのステートメントで、以下の規則が課されます。
- 関数のシグニチャーは、メソッドのシグニチャーと同じであってはなりません (関数の最初の parameter-type と、 メソッドの subject-type を比較)。
- 関数とメソッドをオーバーライド・リレーションシップにすることはできません。 つまり、関数が、最初のパラメーターをサブジェクトとするメソッドである場合、
これが他のメソッドをオーバーライドしたり、
他のメソッドによりオーバーライドされたりすることはできません。 メソッドのオーバーライドについて詳しくは、
CREATE TYPE (構造化)
ステートメントを参照してください。 - 関数にはオーバーライドが適用されないため、2 つの関数がメソッドである場合に、 一方が他方をオーバーライドする状態で存在することは可能です。
上記の規則で各 parameter-type を比較するために、以下が行われます。- パラメーター名、長さ、AS LOCATOR、および FOR BIT DATA は無視されます。
- サブタイプとそのスーパータイプは異なるものと見なされます。
- 特権: 関数の定義者は、関数に対する EXECUTE 特権と、関数をドロップする権利を常に与えられます。 関数を定義するのに必要なすべての特権に対して定義者が WITH GRANT OPTION を持っている場合、
または定義者が SYSADM か DBADM 権限を持っている場合には、
関数の定義者には、関数に対する WITH GRANT OPTION も与えられます。
関数の定義者にそれらの特権が与えられるのは、 それらの特権の派生元の特権が関数の作成時に存在している場合に限ります。 定義者は、これらの特権を直接持っているか、または PUBLIC の特権として持っていることが必要です。 関数の定義者がメンバーであるグループを持つ特権は考慮されません。 関数を使用する場合、接続済みのユーザーの許可 ID には、 そのデータ・ソースでニックネームが参照する表またはビューに対する適切な特権がなければなりません。
- デフォルト値の設定: デフォルト値で定義された関数のパラメーターは、この関数の呼び出し時に、それらのデフォルト値に設定されますが、この関数の呼び出し時に、値が対応する引数に提供されていないか、または DEFAULT で指定されている場合にのみ、このように設定されます。
- EXTERNAL ACTION 関数: EXTERNAL ACTION 関数が最外部の選択リスト以外で呼び出された場合、関数が呼び出される回数は使用されるアクセス・プランによって異なるため、結果が予測不能になります。
- セキュア関数の作成: 通常、SECADM 権限を持つユーザーは、トリガーまたは関数などのデータベース・オブジェクトを作成する特権を持ちません。 一般的に、このユーザーは、関数によってアクセスされるデータを検査し、それがセキュアであることを確認してから、セキュアなユーザー定義関数の作成に必要な特権を現在保持しているユーザーに対して、CREATE_SECURE_OBJECT 権限を付与します。 関数が作成されると、関数所有者の CREATE_SECURE_OBJECT 権限が取り消されます。
SECURED 属性は、ユーザー定義関数に対するすべての変更についての変更制御監査プロシージャーをユーザーが確立したことを宣言する、アサーションとして見なされます。 データベース・マネージャーは、その制御監査プロシージャーが、すべての後続の ALTER FUNCTION ステートメントまたは外部パッケージに対する変更に有効であると見なします。
- セキュア関数での他のユーザー定義関数の呼び出し: セキュア・ユーザー定義関数がその他のユーザー定義関数を呼び出す場合、データベース・マネージャーは、それらのネストしたユーザー定義関数に SECURED 属性があるかどうかを妥当性検査しません。 これらのネストされた関数が機密データにアクセスできる場合、SECADM 権限を持つユーザーは、それらの関数がデータへのアクセスを許可されていること、およびそれらの関数に対するすべての変更に対して変更管理監査プロシージャーが確立されていることを確認する必要があります。
- セキュア属性の変更 (SECURED から NOT SECURED およびその逆) を伴う既存関数の 置換: 関数に依存するパッケージおよび動的キャッシュ SQL ステートメントは、無効になる可能性があります。 これは、行レベルまたは列レベルのアクセス制御がアクティブになっている表が関係するステートメントでは、セキュア属性がアクセス・パスの選択に影響を及ぼすためです。
- 従属パッケージの再バインド: すべてのコンパイル済み SQL 関数には、従属パッケージが存在します。 このパッケージは、REBIND_ROUTINE_PACKAGE プロシージャーを使用していつでも再バインドすることができます。 明示的に従属パッケージを再バインドしても、無効な関数の再有効化は行われません。 自動再有効化を使用するか、または明示的に ADMIN_REVALIDATE_DB_OBJECTS プロシージャーを使用して、無効な関数を再有効化してください。 関数の再有効化では、自動的に従属パッケージが再バインドされます。
- 代替構文: Db2® の以前のバージョンおよび他のデータベース製品との互換性のために、以下の代替の構文がサポートされています。 これらの代替は非標準であり、使用すべきではありません。
- CALLED ON NULL INPUT の代わりに NULL CALL を指定できます。
以下の構文はデフォルトの振る舞いとして受け入れられます。- Unicode データベースでの CCSID UNICODE
- 非 Unicode データベースでの CCSID ASCII
例
- 例 1: 既存のサインおよびコサイン関数を使用して、
値のタンジェントを戻すスカラー関数を定義します。
CREATE FUNCTION TAN (X DOUBLE) RETURNS DOUBLE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN SIN(X)/COS(X) - 例 2: 構造化タイプ PERSON のトランスフォーム関数を定義します。
CREATE FUNCTION FROMPERSON (P PERSON) RETURNS ROW (NAME VARCHAR(10), FIRSTNAME VARCHAR(10)) LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN VALUES (P..NAME, P..FIRSTNAME) - 例 3: 指定された部門番号の従業員を戻す表関数を定義します。
CREATE FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3)) RETURNS TABLE (EMPNO CHAR(6), LASTNAME VARCHAR(15), FIRSTNAME VARCHAR(12)) LANGUAGE SQL READS SQL DATA NO EXTERNAL ACTION DETERMINISTIC RETURN SELECT EMPNO, LASTNAME, FIRSTNME FROM EMPLOYEE WHERE EMPLOYEE.WORKDEPT = DEPTEMPLOYEES.DEPTNO - 例 4:
例 3 から監査付きで表関数を定義します。
CREATE FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3)) RETURNS TABLE (EMPNO CHAR(6), LASTNAME VARCHAR(15), FIRSTNAME VARCHAR(12)) LANGUAGE SQL MODIFIES SQL DATA NO EXTERNAL ACTION DETERMINISTIC BEGIN ATOMIC INSERT INTO AUDIT VALUES (USER, 'Table: EMPLOYEE Prd: DEPTNO = ' CONCAT DEPTNO); RETURN SELECT EMPNO, LASTNAME, FIRSTNME FROM EMPLOYEE WHERE EMPLOYEE.WORKDEPT = DEPTEMPLOYEES.DEPTNO END - 例 5: ストリングを反転するスカラー関数を定義します。
CREATE FUNCTION REVERSE(INSTR VARCHAR(4000)) RETURNS VARCHAR(4000) DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL BEGIN ATOMIC DECLARE REVSTR, RESTSTR VARCHAR(4000) DEFAULT ''; DECLARE LEN INT; IF INSTR IS NULL THEN RETURN NULL; END IF; SET (RESTSTR, LEN) = (INSTR, LENGTH(INSTR)); WHILE LEN > 0 DO SET (REVSTR, RESTSTR, LEN) = (SUBSTR(RESTSTR, 1, 1) CONCAT REVSTR, SUBSTR(RESTSTR, 2, LEN - 1), LEN - 1); END WHILE; RETURN REVSTR; END - 例 6: INOUT パラメーターとして渡される変数を増分し、戻りコードとしてエラーを戻す関数を作成します。
CREATE FUNCTION increment(INOUT result INTEGER, IN delta INTEGER) RETURNS INTEGER BEGIN DECLARE code INTEGER DEFAULT 0; DECLARE SQLCODE INTEGER; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SET code = SQLCODE; RETURN code; END; SET result = result + delta; RETURN code; END@ - 例
7: XML 文書を入力データとして受け取り、顧客名を返す、コンパイル済みの SQL 関数を作成します。
CREATE FUNCTION get_customer_name_compiled(doc XML) RETURNS VARCHAR(25) BEGIN RETURN XMLCAST(XMLQUERY ('$d/customerinfo/name' PASSING doc AS "d")AS VARCHAR(25)); END - 例
8: IN パラメーターとして電話番号および地域番号を受け取り、
OUT XML パラメーターに完全な番号を返す、コンパイル済みの SQL 関数を作成します。
CREATE FUNCTION construct_xml_phone (IN phoneNo VARCHAR(20), IN regionNo VARCHAR(8), OUT full_phone_xml XML) RETURNS VARCHAR(28) LANGUAGE SQL NO EXTERNAL ACTION BEGIN SET full_phone_xml = XMLELEMENT (NAME "phone", regionNo || phoneNo); RETURN regionNo || phoneNo; END
