CREATE FUNCTION (SQL スカラー)
CREATE FUNCTION (SQL スカラー) ステートメントは、現行サーバー上 に SQL 関数を作成します。 この関数は、単一の結果を戻します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むことも、 あるいは対話式に実行することもできます。 これは、動的に準備できる実行可能ステートメントです。
権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- スキーマ内に作成する特権。詳しくは、スキーマ内で作成する必要のある権限を参照してください。
- データベース管理者権限
このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。
- SYSFUNCS カタログ・ビューと SYSPARMS カタログ表の場合
- 該当の表に対する INSERT 特権、および
- QSYS2 ライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
このステートメントの権限 ID によって保持される特権には、少なくとも次の 1 つが含まれていなければなりません。
- 次のシステム権限
- サービス・プログラム作成 (CRTSRVPGM) コマンドに対する *USE
- データベース管理者権限
特殊タイプを参照する場合は、ステートメントの権限 ID によって保持される 特権に、少なくとも次のいずれか 1 つが含まれなければなりません。
- ステートメント内で識別された、それぞれの特殊タイプごとに、
- その特殊タイプに対する USAGE 特権、および
- その特殊タイプを含むライブラリーに対する *EXECUTE システム権限
- データベース管理者権限
- このステートメントの許可 ID には、セキュリティー管理者権限 がなければなりません。 管理権限を参照してください。
既存の関数に置き換えるには、ステートメントの権限 ID が保持する特権に、次のうち少なくともいずれか 1 つを含める必要があります。
- 次のシステム権限
- この関数に関連したサービス・プログラム・オブジェクトに対する *OBJMGT システム権限
- この関数を削除するために必要な全権限
- SYSFUNCS カタログ・ビューと SYSPARMS カタログ表に対する *READ システム権限
- データベース管理者権限
SQL 特権に対応するシステム権限については、『表またはビューへの権限を検査する際の対応するシステム権限』および 『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。
構文
>>-CREATE -+------------+--FUNCTION--function-name--------------> '-OR REPLACE-' >--(--+---------------------------+--)--------------------------> | .-,---------------------. | | V | | '---parameter-declaration-+-' >--+-function-definition----------------+---------------------->< '-WRAPPED--obfuscated-statement-text-' function-definition |--RETURNS -data-type2------------------------------------------> >--option-list--+----------------------+--SQL-routine-body------| '-SET OPTION-statement-' parameter-declaration |--parameter-name--data-type1--+----------------+---------------| '-default-clause-' data-type1, data-type2 |--+-built-in-type------+---------------------------------------| +-distinct-type-name-+ '-array-type-name----'
built-in-type >>-+-+---SMALLINT---+-------------------------------------------------------------------------------------+->< | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)------------------------. | +-+-+-DECIMAL-+-+--+------------------------------+----------------------------------------------------+ | | '-DEC-----' | | .-,0--------. | | | '-+-NUMERIC-+-' '-(--integer--+-----------+--)-' | | '-NUM-----' '-, integer-' | | .-(--53--)------. | +-+-FLOAT--+---------------+-+-------------------------------------------------------------------------+ | | '-(--integer--)-' | | | +-REAL---------------------+ | | | .-PRECISION-. | | | '-DOUBLE--+-----------+----' | | .-(--34--)-. | +---DECFLOAT--+----------+-----------------------------------------------------------------------------+ | '-(--16--)-' | | .-(--1--)-------. | +-+-+-+-CHARACTER-+--+---------------+----------+--+----------------+---------------------+------------+ | | | '-CHAR------' '-(--integer--)-' | +-FOR BIT DATA---+ | | | | '-+-+-CHARACTER-+--VARYING-+--(--integer--)-' +-FOR SBCS DATA--+ | | | | | '-CHAR------' | +-FOR MIXED DATA-+ | | | | '-VARCHAR----------------' '-ccsid-clause---' | | | | .-(--1M--)-------------. | | | '-----+-+-CHARACTER-+--LARGE OBJECT-+------+----------------------+--+----------------+-' | | | '-CHAR------' | '-(--integer--+---+--)-' +-FOR SBCS DATA--+ | | '-CLOB------------------------' +-K-+ +-FOR MIXED DATA-+ | | +-M-+ '-ccsid-clause---' | | '-G-' | | .-(--1--)-------. | +-+---GRAPHIC----+---------------+-------+--+--------------+-------------------------------------------+ | | '-(--integer--)-' | '-ccsid-clause-' | | +-+-GRAPHIC VARYING-+--(--integer--)---+ | | | '-VARGRAPHIC------' | | | | .-(--1M--)-------------. | | | '---DBCLOB----+----------------------+-' | | '-(--integer--+---+--)-' | | +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-+-NATIONAL CHARACTER-+--+---------------+----------+---------------------+--+------------------+-+ | | | +-NATIONAL CHAR------+ '-(--integer--)-' | | '-normalize-clause-' | | | | '-NCHAR--------------' | | | | | '-+-+-NATIONAL CHARACTER-+--VARYING-+--(--integer--)-' | | | | | +-NATIONAL CHAR------+ | | | | | | '-NCHAR--------------' | | | | | '-NVARCHAR------------------------' | | | | .-(--1M--)-------------. | | | '-----+-+-NATIONAL CHARACTER-+--LARGE OBJECT-+------+----------------------+-' | | | '-NCHAR--------------' | '-(--integer--+---+--)-' | | '-NCLOB--------------------------------' +-K-+ | | +-M-+ | | '-G-' | | .-(--1--)-------. | +-+-+-BINARY--+---------------+---------+-----------------+--------------------------------------------+ | | | '-(--integer--)-' | | | | | '-+-BINARY VARYING-+--(--integer--)-' | | | | '-VARBINARY------' | | | | .-(--1M--)-------------. | | | '---+-BLOB----------------+----+----------------------+-' | | '-BINARY LARGE OBJECT-' '-(--integer--+---+--)-' | | +-K-+ | | +-M-+ | | '-G-' | +-+-DATE-------------------------+---------------------------------------------------------------------+ | | .-(--0--)-. | | | +-TIME--+---------+------------+ | | | .-(--6--)-------. | | | '-TIMESTAMP--+---------------+-' | | '-(--integer--)-' | | .-(--200--)-----. | +---DATALINK--+---------------+--+--------------+------------------------------------------------------+ | '-(--integer--)-' '-ccsid-clause-' | +---ROWID----------------------------------------------------------------------------------------------+ '---XML------------------------------------------------------------------------------------------------'
ccsid-clause |--CCSID--integer--+------------------+-------------------------| '-normalize-clause-' normalize-clause .-NOT NORMALIZED-. |--+-NORMALIZED-----+-------------------------------------------| default-clause |--DEFAULT--+-NULL-------------+--------------------------------| +-constant---------+ +-special-register-+ +-global-variable--+ '-(--expression--)-'
option-list .-LANGUAGE SQL-. (1) >>-+--------------+------+-------------------------+------------> '-SPECIFIC--specific-name-' .-NOT DETERMINISTIC . .-EXTERNAL ACTION----. >--+------------------------+--+--------------------+-----------> '-DETERMINISTIC----------' '-NO EXTERNAL ACTION-' .-READS SQL DATA----. .-CALLED ON NULL INPUT ------. >--+-------------------+--+----------------------------+--------> +-CONTAINS SQL------+ '-RETURNS NULL ON NULL INPUT-' '-MODIFIES SQL DATA-' .-INHERIT SPECIAL REGISTERS-. .-STATIC DISPATCH-. >--+---------------------------+--+-----------------+-----------> .-FENCED-----. >--+---------------------+--+------------+----------------------> +-DISALLOW DEBUG MODE-+ '-NOT FENCED-' +-ALLOW DEBUG MODE----+ '-DISABLE DEBUG MODE--' >--+-------------------+----------------------------------------> +-ALLOW PARALLEL----+ '-DISALLOW PARALLEL-' >--+---------------------------------------------------------------+--> | .-DEFAULT---------------------. | '-CONCURRENT ACCESS RESOLUTION--+-+-USE CURRENTLY COMMITTED-+-+-' | '-U-----------------------' | '-+-WAIT FOR OUTCOME-+--------' '-W----------------' .-SYSTEM_TIME SENSITIVE YES-. .-NOT SECURED-. >--+---------------------------+--+-------------+-------------->< '-SYSTEM_TIME SENSITIVE NO--' '-SECURED-----'
- この文節とこの後の option-list にある文節は、どのような順番で指定してもかまいません。各文節を指定できるのは、それぞれ 1 回だけです。
説明
- OR REPLACE
- 現行サーバーにこの関数の定義が存在する場合に、その定義を置き換える、という動作を指定します。実際には、カタログで既存の定義を削除してから新しい定義に置き換える、という動作になりますが、例外として、この関数に対して与えられていた特権は影響を受けません。現行サーバーにこの関数の定義が存在しなければ、このオプションは無視されます。既存の関数を置き換えるには、新しい定義の specific-name および function-name が古い定義の specific-name および function-name と同じであるか、新しい定義のシグニチャーが古い定義のシグニチャーと一致している必要があります。そうでなければ、新しい関数が作成されます。
- function-name
- ユーザー定義の関数の名前を指定します。名前、スキーマ名、パラメ
ーターの数、およびそれぞれのパラメーターのデータ・タイプ (データ・タ
イプの長さ、精度、位取り、または CCSID の属性に関係なく) の組み合わせ
で、現行サーバー上に存在しているユーザー定義の関数を識別してはなりません。
SQL 命名の場合、関数は、暗黙または明示修飾子で指定されたスキーマ内に作成されます。
システム命名の場合、関数は、修飾子で指定されたスキーマ内に作成されます。 修飾子を指定しなかった場合:
- CURRENT SCHEMA 特殊レジスターの値が *LIBL である場合、関数は、現行ライブラリー (*CURLIB) 内に作成されます。
- そうでない場合、関数は現行スキーマ内に作成されます。
通常、それぞれの関数の関数シグニチャーが固有であれば、複数の関数に同じ名前を指定することができます。
一部の関数名は、システムが使用するために予約されています。 詳しくは、CREATE FUNCTIONの『スキーマおよび関数名の選択』を参照してください。
- (parameter-declaration,...)
- 関数の入力パラメーターの数とそれぞれのパラメーターのデータ・タイプを指定します。
各 parameter-declaration は、関数の入力パラメーターを指定します。
最大 2000 のパラメーターを指定することができます。関数は、ゼロまたはそれ以上の入力パラメーターを持つことができます。関数が受け取ると予期しているパラメーターには、それぞれリスト内に 1 個の項目が必要です。関数のパラメーターはすべて入力パラメーターで、ヌル可能です。詳しくは、CREATE FUNCTIONの『パラメーターの定義』を参照してください。
- parameter-name
- パラメーター名を指定します。この名前は、関数の本体に含まれるパラメーターを参照するのに使用されます。 この名前は、パラメーター・リスト内の他のパラメーター名 と同じものであってはなりません。
- data-type1
- 入力パラメーターのデータ・タイプを指定します。このデータ・タイプは、組み込みデータ・タイプまたは特殊データ・タイプにすることができます。
- built-in-type
- 組み込みデータ・タイプを指定します。 それぞれの組み込みデータ・タイプの詳細については、CREATE TABLEを参照してください。
- distinct-type-name
- 特殊タイプを指定します。パラメーターの長さ、精度、または位取り属性は、
特殊タイプのソース・タイプの属性 (CREATE TYPE で指定された属性) と同じになります。特殊タイプの作成についての詳細は、CREATE TYPE (特殊)を参照してください。
特殊タイプの名前が修飾されていない場合、データベース・マネージャーは、SQL パス上のスキーマを検索することでそのスキーマ名を解決します。
- 配列タイプ名
- 配列タイプを指定します。
配列タイプの名前が修飾されていない場合、データベース・マネージャーは、SQL パス上のスキーマを検索することでそのスキーマ名を解決します。
CCSID が指定されている場合、関数に渡される前に、パラメーターはその CCSID に変換されます。CCSID が指定されていない場合は、CCSID は、関数 の呼び出し時点における現行サーバーのデフォルトの CCSID によって決まり ます。
配列タイプ、XML タイプ、または LOB タイプ のパラメーターは、読み取り専用です。
- default-clause
- パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。式は、集約関数および列名を含まない、式で
定義されている任意の式です。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、呼び出し時に省略できません。式ストリングの
最大長は 64K です。
デフォルトの式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません 。
デフォルト式内でリスト中の数値定数を区切る区切り記号として 使用するコンマの後には、スペースが 1 つ必要です。
デフォルト式の中で参照されるすべてのオブジェクト は、関数が作成されるときに存在している必要があります。
配列タイプの パラメーターにデフォルトを指定することはできません。
- RETURNS
- 関数の結果を指定します。
- data-type2
- この関数で返す式を指定します。式の結果のデータ・タイプは、ストレージ割り当て規則に基づいて、RETURNS 文節で定義するデータ・タイプに代入できるデータ・タイプでなければなりません。詳しくは、割り当ておよび比較を参照してください。
あらゆる組み込みデータ・タイプ (ただし、LONG VARCHAR または LONG VARGRAPHIC は除く)、特殊タイプ、または配列タイプを指定することができます。
CCSID が指定され、戻りデータの CCSID が異なる CCSID でコード化されて いる場合、データは指定された CCSID に変換されます。
CCSID が指定されていない場合、戻りデータの CCSID が異なる CCSID でコード化されている場合には、戻りデータはジョブの CCSID (グラフィック・ストリング戻り値の場合は、ジョブに関連したグラフィック CCSID) に変換されます。変換時に文字が失われるのを防ぐために、関数から戻される文字 をすべて表現できる CCSID を明示的に指定することを考慮してください。 これは、データ・タイプがグラフィック・ストリング・データの場合に特に重要です。 この場合、CCSID 1200 または 13488 (ユニコード・グラフィック・ストリング・データ) を使用することを考慮してください。
- LANGUAGE SQL
- これは SQL 関数であることを指定します。
- SPECIFIC specific-name
- 関数の固有名を指定します。特定名の詳細については、CREATE FUNCTIONの『関数に特定の名前を指定する』を参照してください。
- DETERMINISTIC または NOT DETERMINISTIC
- 関数が同じ入力引数を指定して呼び出されるたびに、その関数が同じ結果を戻すかどうかを指定します。デフォルトは NOT DETERMINISTIC です。
- NOT DETERMINISTIC
- 関数が同じ入力引数を指定して呼び出されるたびに、その関数が同じ結果を戻さない場合があることを指定します。関数は、結果に影響を与えるいくつかの状態値によって変わってきます。
データベース・マネージャーは、SQL ステートメントの最適化時にこの情報を使用します。非 deterministic 関数の例として、乱数を生成する関数があります。
非決定的関数を並列タスクで実行すると、間違った結果が返される可能性があります。このような関数には DISALLOW PARALLEL 文節を指定してください。
NOT DETERMINISTIC は、特殊レジスター、非決定的関数、またはシーケンスに対する参照が この関数に含まれている場合に指定してください。
- DETERMINISTIC
- 関数が同じ入力引数を指定して呼び出されるたびに、その関数が常に同じ結果を戻すかを指定します。データベース・マネージャー は、SQL ステートメントの最適化時にこの情報を使用します。 1deterministic 関数の例としては、入力引数の平方根を計算する関数があります。
- EXTERNAL ACTION または NO EXTERNAL ACTION
- 関数が、データベース・マネージャーが管理しないオブジェクトの状態を変更するアクションを行うかどうかを指定します。外部アクションの例には、メッセージの送信やストリーム・ファイルへのレコードの書き込みなどがあります。デフォルトは EXTERNAL ACTION です。
- EXTERNAL ACTION
- 関数が、データベース・マネージャーが管理しないオブジェクトの状態を変更するアクションを行うことができるかを指定します。したがって、関数は、それぞれの連続関数呼び出しで呼び出す必要があります。 EXTERNAL ACTION は、この関数に、外部アクションを持つ他の関数に対する 参照が含まれている場合に、指定してください。
- NO EXTERNAL ACTION
- 関数は外部アクションを行いません。
この関数は、連続した各関数呼び出しごとに呼び出す必要はありません。
NO EXTERNAL ACTION 関数は、連続した各関数呼び出しごとに呼び出されない場合があるので、EXTERNAL ACTION 関数よりもパフォーマンスが向上する可能性があります。
- CONTAINS SQL、READS SQL DATA、または MODIFIES SQL DATA
- 関数が実行できる SQL ステートメントの種別を指定します。データベース・マネージャーは、この関数で実行する SQL ステートメントがその指定内容と整合しているかどうかを検査します。各ステートメントの分類については、SQL ステートメントの特性を参照してください。
デフォルトは、READS SQL
DATA です。このオプションは、すべてのパラメーター・デフォルト式に適用されます。
- READS SQL DATA
- この関数が、データ・アクセス種別 READS SQL DATA、CONTAINS SQL、または NO SQL のステートメントを実行できるように指定します。この関数は、データの変更を行う SQL ステートメントは実行できません。
- CONTAINS SQL
- この関数が、データ・アクセス種別 CONTAINS SQL または NO SQL の SQL ステートメントのみを実行できるように指定します。この関数は、データの読み取りまたは変更を行う SQL ステートメントを実行できません。
- MODIFIES SQL DATA
- この関数は、どの関数でもサポートされないステートメントを除く すべての SQL ステートメントを実行できます。
- RETURNS NULL ON NULL INPUT または CALLED ON NULL INPUT
- 入力引数のいずれかが実行時にヌルである場合に関数を呼び出すかどうかを指定します。
- RETURNS NULL ON INPUT
- 入力引数のいずれかが NULL である場合に関数を呼び出さないことを指定します。 結果は NULL 値です。
- CALLED ON NULL INPUT
- 引数値のいずれかまたは全部がヌルである場合に関数を呼び出すことを指定します。この指定は、ヌル引数値のテストを行うように関数をコーディングする必要があります。関数は NULL または非 NULL 値を戻すことができます。
- INHERIT SPECIAL REGISTERS
- 特殊レジスターの既存の値は、関数に入った後に継承されることを指定します。
- STATIC DISPATCH
- 関数を静的にディスパッチすることを指定します。 すべての関数が静的にディスパッチされます。
- DISALLOW DEBUG MODE、ALLOW DEBUG MODE、または DISABLE DEBUG MODE
-
関数を Unified Debugger でデバッグできるように作成するかどうかを示します。DEBUG MODE を指定する場合は、SET OPTION ステートメント内の DBGVIEW オプションを指定してはなりません。
- DISALLOW DEBUG MODE
- 関数は Unified Debugger でデバッグできません。関数の DEBUG MODE 属性が DISALLOW の場合、後で関数を変更してデバッグ・モード属性を変えることができます。
- ALLOW DEBUG MODE
- 関数は Unified Debugger でデバッグすることができます。関数の DEBUG MODE 属性が ALLOW の場合、後で関数を変更してデバッグ・モード属性を変えることができます。
- DISABLE DEBUG MODE
- 関数は Unified Debugger でデバッグできません。関数の DEBUG MODE 属性が DISABLE の場合、後で関数を変更してデバッグ・モード属性を変えることはできません。
関数に FENCED または ALLOW PARALLEL が指定 されている場合、DEBUG MODE オプションは無視されます。DISALLOW DEBUG MODE が使用されます。
DEBUG MODE を指定せずに SET OPTION ステートメント内の DBGVIEW オプションを指定した場合、関数を Unified Debugger でデバッグすることはできませんが、システム・デバッグ機能を使用してデバッグできる場合があります。 DEBUG MODE オプションも DBGVIEW オプションも指定しない場合は、CURRENT DEBUG MODE 特殊レジスターでのデバッグ・モードが使用されます。
- FENCED または NOT FENCED
- データベース・マネージャー環境から分離した環境で SQL 関数を実行するかどうかを指定します。
FENCED がデフォルトです。
- FENCED
- この関数は別のスレッドで実行されます。
FENCED 関数では、関数の呼び出し間で SQL カーソルをオープン状態のままにすることができません。 ただし、あるスレッド内のカーソルは他のスレッド内のカーソルから独立しています。このことは、カーソル名の競合が起きる可能性を低くしています。
- NOT FENCED
- この関数は、呼び出し元の SQL ステートメントと同じスレッド内で実行できます。
NOT FENCED 関数では、関数の呼び出し間で SQL カーソルをオープン状態のままにすることができます。 カーソルをオープン状態のままにしておくことができるため、関数の 呼び出し間でカーソル位置も同じに維持されます。 ただし、UDF が呼び出し元の SQL ステートメントおよび他の NOT FENCED UDF と同じスレッド内で実行されるためにカーソル名が競合する場合があります。
NOT FENCED 関数は、通常 FENCED 関数よりもパフォーマンスが良好です。
- ALLOW PARALLEL または DISALLOW PARALLEL
- 関数を並列で実行できるかどうかを指定します。
NOT DETERMINISTIC、EXTERNAL ACTION、MODIFIES SQL DATA のいずれか 1 つ以上の文節を指定すると、デフォルトは DISALLOW PARALLEL になります。それ以外の場合は、ALLOW PARALLEL がデフォルトです。
- ALLOW PARALLEL
- データベース・マネージャーが関数の並列処理を考慮できることを指定します。データベース・マネージャーは、この関数を呼び出す SQL ステートメントまたはこの関数の中で実行する SQL ステートメントで並列処理を使用しなければならない、というわけではありません。
ALLOW PARALLEL の指定に関する注意点については、NOT DETERMINISTIC、EXTERNAL ACTION、MODIFIES SQL DATA の説明を参照してください。
- DISALLOW PARALLEL
- データベース・マネージャーが関数の並列処理を使用してはならないことを指定します。
- CONCURRENT ACCESS RESOLUTION
- データベース・マネージャーが更新プロセスの過程にあるデータを待つかどうかを指定します。DEFAULT がデフォルトです。
- DEFAULT
- この関数に関する並行アクセスの解決方法を明示的に設定しないことを指定します。この関数の呼び出し時に有効だった値が使用されます。
- WAIT FOR OUTCOME
- データベース・マネージャーが更新プロセスの過程にあるデータのコミットまたはロールバックを待つ、という動作を指定します。
- USE CURRENTLY COMMITTED
- データベース・マネージャーが更新プロセスの過程にあるデータを検出したときに現時点でのコミット済みバージョンのデータを使用する、という動作を指定します。
- 読み取りトランザクションと削除/更新トランザクションの間でロックの競合が発生した場合に、この文節の適用対象になるのは、分離レベル CS のスキャンです (CS KEEP LOCKS のスキャンは対象になりません)。
- SYSTEM_TIME SENSITIVE
- 静的および動的 SQL ステートメントの両方でのシステム期間テンポラル表への参照が、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けるかどうかを決定します。YES がデフォルトです。
- YES
- システム期間テンポラル表への参照は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けます。
- NO
- システム期間テンポラル表の参照は、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターの値の影響を受けません。
- NOT SECURED または SECURED
- 関数が行アクセス制御と列アクセス制御においてセキュアであると見なされるかどうかを指定します。
- NOT SECURED
- 関数が行アクセス制御と列アクセス制御において非セキュアであると見なされることを 指定します。これはデフォルトです。
- 表でアクティブな列アクセス制御が使用されている場合、関数の呼び出し時に、関数の引数が、列マスクが有効になっている列を参照してはなりません。
- SECURED
- 関数が行アクセス制御と列アクセス制御においてセキュアであると見なされることを指定します。
- 関数は、行の許可または列マスク内で参照される場合は、セキュアとして定義される 必要があります。
- WRAPPED obfuscated-statement-text
- エンコードされた関数定義を指定します。WRAP スカラー関数を使用して CREATE FUNCTION ステートメント をエンコードできます。
- SET OPTION ステートメント
- 関数を作成するときに使用するオプションを指定します。
これらのオプションは、すべてのデフォルト値式にも適用されます。 例えば、デバッグ可能な関数を作成するときは、次のステートメントを含め
ることができます。
各オプションのデフォルト値は、作成時に有効だったオプションによって異なります。詳細については、SET OPTIONを参照してください。SET OPTION DBGVIEW = *SOURCE
オプション CNULRQD、CNULIGN、COMPILEOPT、NAMING、SQLCA は、CREATE FUNCTIONステートメントでは使用できません。デフォルト値式を処理するときには、オプション ALWCPYDTA、 CONACC、DATFMT、DATSEP、DECFLTRND、DECMPT、
DECRESULT、DFTRDBCOL、LANGID、 SQLCURRULE、SQLPATH、SRTSEQ、TGTRLS、TIMFMT、および TIMSEP が使用されます。 - SQL-routine-body
- 単一の SQL-procedure-statement (複合ステートメントを含む) を指定します。
SQL 関数の定義についての詳細は、SQL 制御ステートメントを参照してください。
CONNECT、SET CONNECTION、RELEASE、DISCONNECT、COMMIT、 ROLLBACK および SET TRANSACTION ステートメントを実行するプロシージャーへの呼び出しは、関数内では使用できません。
SQL-routine-body が複合ステートメントである場合は、その ステートメントには RETURN ステートメントが少なくとも 1 つは含まれてい なければならず、関数の呼び出し時に RETURN ステートメントが 1 つ実行される必要があります。
REPLACE キーワードを指定する ALTER PROCEDURE (SQL)、ALTER FUNCTION (SQL スカラー)、および ALTER FUNCTION (SQL 表) は、SQL-routine-body では使用できません。
注
ユーザー定義関数の定義に関する一般考慮事項: ユーザー定義関数の定義に関する一般情報については、CREATE FUNCTIONを参照してください。
SQL パスと関数解決: 関数本体にある関数呼び出しは、CREATE FUNCTION ステートメントの有効な SQL パス (関数作成後も変わらない SQL パス) に基づいて解決されます。
関数の所有権: SQL 名が指定されている場合、
- 作成した関数が入れられるスキーマと同じ名前のユーザー・プロファイルが存在する場合、関数の所有者 はそのユーザー・プロファイルです。
- その他の場合は、関数の所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたは グループ・ユーザー・プロファイルです。
システム名を指定した場合は、関数の所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。
関数の権限: SQL 名を使用する場合は、関数は、*PUBLIC に対するシステム権限 *EXCLUDE を使用して作成されます。 システム名を使用する場合、関数は、スキーマの作成権限 (CRTAUT) パラメーターによって決められる *PUBLIC に対する権限を使用して作成されます。
関数の所有者がグループ・プロファイルのメンバー (GRPPRF キーワード) で あり、グループ権限が指定されている (GRPAUT キーワード) 場合は、そのグ ループ・プロファイルにも、その関数に対する権限が与えられます。
- 既存のコメントまたはラベルは破棄されます。
- 権限を持つユーザーは維持されます。オブジェクト所有者は変更される可能性があります。
- 現在のジャーナル監査は保持されます。
関数が置き換えられ、 関数シグニチャーまたは結果データ・タイプ が変更される場合、その関数を参照する、任意の関数、マテリアライズ照会表、プロシージャー、 トリガー、およびビューからの結果は、予測不能なものになる可能性があります。参照されるオブジェクトはすべて再作成する必要があります。
関数の作成: SQL 関数が作成される際、データベース・マネージャーは、組み込み SQL ステートメントと一緒に C ソース・コードが収められる一時ソース・ファイルを作成します。次いで 、CRTSRVPGM コマンドを使用して、*SRVPGM オブジェクトが作成されます。 サービス・プログラムの作成に使用される SQL オプションは、CREATE FUNCTION ステートメントの実行時に有効なオプションです。サービス・プログラムは、ACTGRP(*CALLER) を使用して作成します。
SQL 関数が作成されると、関数の属性 は、作成されたサービス・プログラム・オブジェクトに保管されます。*SRVPGM オブジェクトが保管された後、このシステムまたは別のシステムに 復元されると、属性が使用されてカタログが更新されます。
ソース・ファイル・メンバーと *SRVPGM オブジェクトの判別には、特定名が使用されます。 特定名が有効なシステム名ならば、その特定名がメンバーやプログラムの名前として使用されます。 メンバーは、既に存在している場合、オーバーレイされます。指定されたライブラリー内にプログラムが既に存在している場合は、システム表名の生成に関する規則を使用して固有名が生成されます。 特定名が有効なシステム名でない場合は、システム表名の生成に関する規則を使用して固有名が生成されます。
関数の呼び出し: SQL 関数が呼び出されると、 その関数は呼び出し側プログラムの活動化グループ内で実行します。
選択ステートメント の選択リスト で関数が指定され、その関数が EXTERNAL ACTION または MODIFIES SQL DATA を指定している場合、関数は、戻される各行に対してだけ呼び出されます。それ以外の場合は、選択されていない行に対して UDF が呼び出されることも あります。
- SQL 関数は決定的です。
- SQL-routine-body に RETURN ステートメントだけが入っています。
- 関数で参照されるすべてのオブジェクトが、関数の作成時に存在しています。
- SQL-routine-body に、入力パラメーターを参照する共通表式が含まれません。
- 照会が SQL 照会エンジン (SQE) に適格です。
- 関数がオブジェクトを参照し、関数と照会の権限属性が、次のいずれかの条件に基づいて互換です。
- 関数がユーザーの権限 (*USER) で実行されるよう定義されています。
- 照会が所有者の権限 (*OWNER) で実行され、照会の所有者が関数の所有者と同じです。
- 照会がユーザーの権限 (*USER) で実行され、そのユーザーが関数の所有者と同じです。
- PARALLEL または NOT PARALLEL
- MODIFIES SQL DATA
- コミットメント制御レベル
- CONCURRENT ACCESS RESOLUTION
- ALWCPYDTA
- ATOMIC または NOT ATOMIC
関数が インラインで記述されていて、特殊レジスターへの参照を含んでいる場合、その特殊レジスターの 値は、照会内の同じ特殊レジスターへの他の参照と同じになります。
- SELECT INTO の選択リスト
- DECLARE CURSOR の選択リスト
- SET ステートメントの右側にあるスカラー副選択の選択リスト
難読化されたステートメント: CREATE FUNCTION ステートメントは、 難読化された形式で実行できます。難読化されたステートメントでは、 WRAPPED キーワードの前にある関数名とパラメーターのみが判読 可能です。ステートメントの残りは、判読できないが、難読化されたステートメントをサポートするデータベース・サーバー によってデコード可能なように、エンコードされます。難読化されたステートメント は、WRAP スカラー関数を呼び出すことによって生成できます。難読化されたステートメントから関数が 作成されるときに指定されるデバッグ・オプションはすべて無視されます。 難読化されたステートメントから作成された関数を 難読化がサポートされていないリリースにリストアすることはできません。
デフォルト値の設定: 関数のパラメーターがデフォルト値を指定して定義され ていれば、その関数の呼び出し時にパラメーターはデフォルト値に設定されますが、 それは、対応する引数に値が与えられていない場合か、引数が DEFAULT と指定されている場合に限ります。
従属オブジェクト: SQL ルーチンは、SQL-routine-body で参照されるオブジェクトに従属します。 従属オブジェクトの名前は、カタログ・ビュー SYSROUTINEDEP に保管されます。 SQL-routine-body のオブジェクト参照が完全修飾名である場合、または非修飾名が現行スキーマによって SQL 命名で修飾されている場合、SYSROUTINEDEP 内のオブジェクトのスキーマ名は、指定された名前か現行スキーマの値に設定されます。 それ以外の場合は、スキーマ名は、特定のスキーマ名に設定されません。 名前を特定のスキーマ名に設定しないと、DROP ステートメントおよび ALTER ステートメントは、ルーチンが変更中または除去中のオブジェクトに従属しているかどうかを判別することができません。
代替構文: 以下のキーワードは、旧リリースとの互換性を維持するためにサポートされている同義語です。 これらのキーワードは標準キーワードではないので、原則として使用しないようにしてください。
- キーワード VARIANT と NOT VARIANT は、NOT DETERMINISTIC と DETERMINISTIC の同義語として使用することができます。
- キーワード NULL CALL と NOT NULL CALL は、CALLED ON NULL INPUT と RETURNS NULL ON NULL INPUT の 同義語として使用できます。
- DETERMINISTIC の同義語として、キーワード IS DETERMINISTIC を使用できます。
例
例 1: 既存の組み込み関数 SIN と COS を使用して値のタンジェントを返すスカラー関数を定義します。
CREATE FUNCTION TAN
(X DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN SIN(X)/COS(X)
パラメーター名 (X) が関数 TAN の入力パラメーターに指定されていることに注意してください。 パラメーター名は関数の本体で使用され、入力パラメーターを参照します。 SIN 関数および COS 関数の呼び出し時に、 TAN ユーザー定義関数の本体でパラメーター X を入力として渡します。
例 2: mm/dd/yyyy の後に最大 3 文字のストリングを追加した形式で日付を返すスカラー関数を定義します。
CREATE FUNCTION BADPARM
(INP1 DATE,)
USA VARCHAR(3))
RETURNS VARCHAR(20)
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN CHAR(INP1,USA)CONCAT USA
以下のステートメントでこの関数を呼び出すとします。
SELECT BADPARM(BIRTHDATE,'ISO')
FROM EMPLOYEE WHERE EMPNO='000010'
結果は「08/24/1933ISO」です。ここで注目したいのは、BADPARM 関数の入力パラメーターとして、パラメーター名 (INP1 と USA) が指定されていることです。確かに USA という名前の入力パラメーターは存在しますが、CHAR 関数のパラメーター・リストに含まれている USA のインスタンスは、USA という名前のパラメーターとしてではなく、組み込みの CHAR 関数のキーワード・パラメーターとして取り込まれます。