CREATE FUNCTION (SQL 表)

CREATE FUNCTION (SQL 表) ステートメントは、現行サーバー上に SQL 表関数を作成します。 その関数は単一の結果表を戻します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むことも、 あるいは対話式に実行することもできます。 これは、動的に準備できる実行可能ステートメントです。

権限

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

  • SYSFUNCS カタログ・ビューと SYSPARMS カタログ表の場合
    • 該当の表に対する INSERT 特権、および
    • QSYS2 ライブラリーに対する *EXECUTE システム権限
  • データベース管理者権限

このステートメントの権限 ID によって保持される特権には、少なくとも次の 1 つが含まれていなければなりません。

  • 次のシステム権限
    • サービス・プログラム作成 (CRTSRVPGM) コマンドに対する *USE
  • データベース管理者権限

特殊タイプを参照する場合は、ステートメントの権限 ID によって保持される 特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

  • ステートメント内で識別された、それぞれの特殊タイプごとに、
    • その特殊タイプに対する USAGE 特権、および
    • その特殊タイプを含むライブラリーに対する *EXECUTE システム権限
  • データベース管理者権限
SECURED 属性が指定されるか、 または、関数がセキュアで OR REPLACE が指定される場合は、次のとおりです。
  • このステートメントの許可 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

                     .-,-----------------------.      
                     V                         |      
|--RETURNS TABLE--(----column-name--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-'   

構文図を読む構文図をスキップする
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-----.                          
>--+------------+--+-------------------+------------------------>
   '-NOT FENCED-'  +-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-----'   

>--+---------------------+--------------------------------------|
   '-CARDINALITY--bigint-'   

注:
  1. この文節とこの後の option-list にある文節は、どのような順番で指定してもかまいません。各文節を指定できるのは、それぞれ 1 回だけです。
構文図を読む構文図をスキップする
SQL-routine-body

|----SQL-control-statement--------------------------------------|

説明

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 パス上のスキーマを検索することでそのスキーマ名を解決します。

CCSID が指定されている場合、関数に渡される前に、パラメーターはその CCSID に変換されます。CCSID が指定されていない場合は、CCSID は、関数 の呼び出し時点における現行サーバーのデフォルトの CCSID によって決まり ます。

default-clause
パラメーターのデフォルト値を指定します。デフォルト値は、定数、特殊レジスター、グローバル変数、式、またはキーワード NULL にすることができます。式は、集約関数および列名を含まない、で 定義されている任意の式です。デフォルト値が指定されていない場合、パラメーターにデフォルト値がないため、呼び出し時に省略できません。式ストリングの 最大長は 64K です。

デフォルトの式は、 パラメーターのデータ・タイプに対して割り当ての互換性がなければなりません 。

デフォルト式内でリスト中の数値定数を区切る区切り記号として 使用するコンマの後には、スペースが 1 つ必要です。

デフォルト式の中で参照されるすべてのオブジェクト は、関数が作成されるときに存在している必要があります。

RETURNS TABLE
関数の出力表を指定します。

変更の始まりパラメーターの数が N であるとすると、列の数は 8000-N 以下でなければなりません。変更の終わり

column-name
出力表の列の名前を指定します。 同じ名前を何度も指定することはできません。
data-type2
出力のデータ・タイプと属性を指定します。

あらゆる組み込みデータ・タイプ (ただし、LONG VARCHAR または LONG VARGRAPHIC は除く) や特殊タイプを指定することができます。 関数が呼び出されると、結果は、(記憶域割り当て規則を使用して) これらのデータ・タイプに割り当てられます。

CCSID が指定され、戻りデータの CCSID が異なる CCSID でコード化されて いる場合、データは指定された CCSID に変換されます。

CCSID が指定されず、関数がビューで参照されない場合、戻りデータの CCSID が異なる CCSID でコード化されている場合には、戻りデータはジョブの CCSID (グラフィック・ストリング戻り値の場合は、ジョブに関連したグラフィック CCSID) に変換されます。変換時に文字が失われるのを防ぐために、関数から戻される文字 をすべて表現できる CCSID を明示的に指定することを考慮してください。 これは、データ・タイプがグラフィック・ストリング・データの場合に特に重要です。 この場合、CCSID 1200 または 13488 (ユニコード・グラフィック・ストリング・データ) を使用することを考慮してください。

CCSID が指定されず、関数がビューで参照される場合、戻りデータは、関連するビュー列の CCSID に変換されます。 変換時に文字が失われるのを防ぐために、関数から戻される文字 をすべて表現できる CCSID を明示的に指定することを考慮してください。 これは、データ・タイプがグラフィック・ストリング・データの場合に特に重要です。 この場合、CCSID 1200 または 13488 (ユニコード・グラフィック・ストリング・データ) を使用することを考慮してください。

LANGUAGE SQL
これは SQL 関数であることを指定します。
SPECIFIC specific-name
関数の固有名を指定します。特定名の詳細については、CREATE FUNCTIONの『関数に特定の名前を指定する』を参照してください。
DETERMINISTIC または NOT DETERMINISTIC
関数が同じ入力引数を指定して呼び出されるたびに、その関数が同じ結果を戻すかどうかを指定します。デフォルトは NOT DETERMINISTIC です。
NOT DETERMINISTIC
関数が同じ入力引数を指定して呼び出されるたびに、その関数が同じ結果を戻さない場合があることを指定します。関数は、結果に影響を与えるいくつかの状態値によって変わってきます。 データベース・マネージャーは、SQL ステートメントの最適化時にこの情報を使用します。表関数の結果表に影響するような方法で、特殊レジスター、非決定的な関数、シーケンスのいずれかを参照する表関数は、非決定的な表関数の例です。
DETERMINISTIC
関数が同じ入力引数を指定して呼び出されるたびに、その関数が常に同じ結果表を戻すかを指定します。データベース・マネージャー は、SQL ステートメントの最適化時にこの情報を使用します。 1
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 NULL INPUT
入力引数のいずれかがヌルである場合に関数を呼び出さないことを指定します。結果は、表に行がない、空表になります。 RETURNS NULL ON NULL INPUT がデフォルトです。
CALLED ON NULL INPUT
引数値のいずれかがヌルである場合に関数を呼び出すことを指定します。この指定は、ヌル引数値のテストを行うように関数をコーディングする必要があります。関数は、その論理に よっては、空の表を戻す場合があります。
INHERIT SPECIAL REGISTERS
特殊レジスターの既存の値は、関数に入った後に継承されることを指定します。
STATIC DISPATCH
関数を静的にディスパッチすることを指定します。 すべての関数が静的にディスパッチされます。
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 ステートメント をエンコードできます。
CARDINALITY bigint
このオプションの文節は、最適化を目的として、この関数が戻すも のとして予期される行数の見積もりを指定します。 整数の有効な値の範囲は、0 から 9 223 372 036 854 775 807 です。

表関数に対して CARDINALITY 文節を指定しない場合は、データベース・マネージャーは、デフォルトとして特定の有限値を想定します。

変更の始まり呼び出されるたびに行を戻して表終了状態を戻すことのない表関数は、無限カーディナリティーを持ちます。 データを戻す前に結果としての表終了状態を必要とする照会がこのような関数を呼び出すと、その照会は中断しない限り戻りません。変更の終わり

SET OPTION ステートメント
関数を作成するときに使用するオプションを指定します。 これらのオプションは、すべてのデフォルト値式にも適用されます。 例えば、デバッグ可能な関数を作成するときは、次のステートメントを含め ることができます。
SET OPTION DBGVIEW = *SOURCE 
各オプションのデフォルト値は、作成時に有効だったオプションによって異なります。詳しくは、SET OPTIONを参照してください。

オプション CNULRQD、CNULIGN、COMPILEOPT、NAMING、SQLCA は、CREATE FUNCTIONステートメントでは使用できません。 CLOSQLCSR(*ENDACTGRP) は、常に SQL 表関数に対して使用されます。デフォルト値式を 処理するときには、オプション ALWCPYDTA、CONACC、DATFMT、DATSEP、DECFLTRND、DECMPT、
DECRESULT、DFTRDBCOL、LANGID、SQLCURRULE、 SQLPATH、SRTSEQ、TGTRLS、TIMFMT、および TIMSEP が使用されます。

SQL-routine-body
複合ステートメントも含め、単一の SQL ステートメントを指定します。 SQL 関数の定義についての詳細は、SQL 制御ステートメントを参照してください。

変更の始まり非パイプライン表関数は、 厳密に 1 つの RETURN ステートメントを含む必要があります。 パイプライン表関数は、少なくとも 1 つの RETURN ステートメントを含む必要があります。 関数を呼び出すときに、RETURN ステートメントを実行する必要があります。変更の終わり

CONNECT、SET CONNECTION、RELEASE、DISCONNECT、COMMIT、 ROLLBACK および SET TRANSACTION ステートメントを実行するプロシージャーへの呼び出しは 、関数内では使用できません。

REPLACE キーワードを指定する ALTER PROCEDURE (SQL)、ALTER FUNCTION (SQL スカラー)、および ALTER FUNCTION (SQL 表) は、SQL-routine-body では使用できません。

ユーザー定義関数の定義に関する一般考慮事項: ユーザー定義関数の定義に関する一般情報については、SQL 制御ステートメントを参照してください。

関数の所有権: SQL 名が指定されている場合、

  • 作成した関数が入れられるスキーマと同じ名前のユーザー・プロファイルが存在する場合、関数の所有者 はそのユーザー・プロファイルです。
  • その他の場合は、関数の所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたは グループ・ユーザー・プロファイルです。

システム名を指定した場合は、関数の所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。

関数の権限: SQL 名を使用する場合は、関数は、*PUBLIC に対するシステム権限 *EXCLUDE を使用して作成されます。 システム名を使用する場合、関数は、スキーマの作成権限 (CRTAUT) パラメーターによって決められる *PUBLIC に対する権限を使用して作成されます。

関数の所有者がグループ・プロファイルのメンバー (GRPPRF キーワード) で あり、グループ権限が指定されている (GRPAUT キーワード) 場合は、そのグ ループ・プロファイルにも、その関数に対する権限が与えられます。

変更の始まり

パイプライン関数と非パイプライン関数: SQL 表関数には、2 つのタイプがあります。 SQL-routine-body 内に PIPE ステートメントを含まない表関数は、非パイプライン表関数です。 これには、表を戻す 1 個の RETURN ステートメントが含まれます。 パイプライン表関数は、戻り値のない 1 個以上の RETURN ステートメントと 0 個以上 PIPE ステートメントが SQL-routine-body 内に含まれている表関数です。 これは、一度に 1 行を表に戻します。 この 2 つのタイプの表関数は、まったく同じ方法で呼び出されます。

PIPE ステートメントは、表関数からの結果行を戻します。次の行を取得するために、制御は SQL-routine-body 内の PIPE ステートメントの次のステートメントに戻ります。

変更の終わり
REPLACE の規則: REPLACE によって関数を再作成する場合は、以下のようになります。
  • 既存のコメントまたはラベルは破棄されます。
  • 権限を持つユーザーは維持されます。オブジェクト所有者は変更される可能性があります。
  • 現在のジャーナル監査は保持されます。

関数が置き換えられ、 関数シグニチャーまたは結果データ・タイプ が変更される場合、その関数を参照する、任意の関数、マテリアライズ照会表、プロシージャー、 トリガー、およびビューからの結果は、予測不能なものになる可能性があります。参照されるオブジェクトはすべて再作成する必要があります。

関数の作成: SQL 関数が作成される際、データベース・マネージャーは、組み込み SQL ステートメントと一緒に C ソース・コードが収められる一時ソース・ファイルを作成します。次いで 、CRTSRVPGM コマンドを使用して、*SRVPGM オブジェクトが作成されます。 サービス・プログラムの作成に使用される SQL オプションは、CREATE FUNCTION ステートメントの実行時に有効なオプションです。サービス・プログラムは、ACTGRP(*CALLER) を使用して作成します。

SQL 関数が作成されると、関数の属性 は、作成されたサービス・プログラム・オブジェクトに保管されます。*SRVPGM オブジェクトが保管された後、このシステムまたは別のシステムに 復元されると、属性が使用されてカタログが更新されます。

ソース・ファイル・メンバーと *SRVPGM オブジェクトの判別には、特定名が使用されます。 特定名が有効なシステム名ならば、その特定名がメンバーやプログラムの名前として使用されます。 メンバーは、既に存在している場合、オーバーレイされます。指定されたライブラリー内にプログラムが既に存在している場合は、システム表名の生成に関する規則を使用して固有名が生成されます。 特定名が有効なシステム名でない場合は、システム表名の生成に関する規則を使用して固有名が生成されます。

関数の呼び出し: SQL 関数が呼び出されると、 その関数は呼び出し側プログラムの活動化グループ内で実行します。

変更の始まり
インライン関数: SQL 表関数がインライン化された場合、照会の一部として関数を呼び出す代わりに、関数の RETURN ステートメントの全選択 を照会自体にコピーする (インラインで書き込む) こともできます。 そのような関数のことをインライン関数 といいます。以下の場合に、表関数はインライン関数 です。
  • SQL 関数が NO EXTERNAL ACTION として定義されています。
  • SQL-routine-body に RETURN ステートメントだけが入っています。
  • 関数で参照されるすべてのオブジェクトが、関数の作成時に存在しています。
  • SQL-routine-body に、入力パラメーターを参照する共通表式が含まれません。
インライン関数 は、 以下の場合にのみ、照会にコピー (インラインで記述) されます。
  • 照会が SQL 照会エンジン (SQE) に適格です。
  • 関数がオブジェクトを参照し、関数と照会の権限属性が、次のいずれかの条件に基づいて互換です。
    • 関数がユーザーの権限 (*USER) で実行されるよう定義されています。
    • 照会が所有者の権限 (*OWNER) で実行され、照会の所有者が関数の所有者と同じです。
    • 変更の始まり照会がユーザーの権限 (*USER) で実行され、そのユーザーが関数の所有者と同じです。変更の終わり
    注 : 関数が FENCED として定義されている場合、照会は借用権限を使用してはなりません。 照会が所有者の権限 (*OWNER) で実行され、関数がユーザーの権限 (*USER) で実行される場合、照会の所有者はこのユーザーと同じでなければなりません。
関数がインライン化されると、関数の作成時に指定されたオプションの中で、以下のオプションが無視されます。
  • PARALLEL または NOT PARALLEL
  • MODIFIES SQL DATA
  • コミットメント制御レベル
  • CONCURRENT ACCESS RESOLUTION
  • ALWCPYDTA
  • ATOMIC または NOT ATOMIC

関数が インラインで記述されていて、特殊レジスターへの参照を含んでいる場合、その特殊レジスターの 値は、照会内の同じ特殊レジスターへの他の参照と同じになります。

変更の終わり

難読化されたステートメント: CREATE FUNCTION ステートメントは、 難読化された形式で実行できます。難読化されたステートメントでは、 WRAPPED キーワードの前にある関数名とパラメーターのみが判読 可能です。ステートメントの残りは、判読できないが、難読化されたステートメントをサポートするデータベース・サーバー によってデコード可能なように、エンコードされます。難読化されたステートメント は、WRAP スカラー関数を呼び出すことによって生成できます。難読化されたステートメントから関数が 作成されるときに指定されるデバッグ・オプションはすべて無視されます。 難読化されたステートメントから作成された関数を 難読化がサポートされていないリリースにリストアすることはできません。

従属オブジェクト: 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 を使用できます。

指定した部門番号に該当する社員を戻す表関数を定義します。

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
  DISALLOW PARALLEL
  RETURN
      SELECT EMPNO,LASTNAME,FIRSTNME
        FROM EMPLOYEE
        WHERE EMPLOYEE.WORKDEPT =DEPTEMPLOYEES.DEPTNO
1 照会オプティマイザーは、deterministic な表関数の結果を キャッシュに入れるよう選択する場合があります。DETERMINISTIC_UDF_SCOPE QAQQINI オプションを使用して、キャッシュに入れる範囲を制御することができます。詳細については、「データベース パフォーマンスおよび Query 最適化」トピック集を参照してください。