CREATE FUNCTION 文(インラインSQLスカラー関数)
CREATE FUNCTION (インライン化された SQL スカラー) ステートメントは、SQL スカラー関数を現行サーバー上で定義し、その関数の本体に SQL プロシージャー型言語 RETURN ステートメントを指定します。 関数は、呼び出されるたびに単一の値を戻します。
インライン化されたSQLスカラー関数に対してパッケージは作成されません。 この関数は照会の一部としては呼び出されません。代わりに、関数の RETURN ステートメントの expression が照会自体にコピー (インライン化) されます。
CREATE FUNCTION(インラインSQLスカラー)の呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 これは、DYNAMICRULES RUN動作が有効になっている場合にのみ、動的に準備できる実行可能なステートメントです。 詳細は、「Authorization IDs and dynamic SQL」 を参照してください。
CREATE FUNCTION(インラインSQLスカラー)の権限
以下に定義する特権セットには、少なくとも次のいずれかが含まれていなければなりません。
- スキーマに対する CREATEIN 特権
- SYSADM または SYSCTRL 権限
- システム DBADM
- インストール SYSOPR 権限 (プロセスの現行 SQLID が SYSINSTL に設定されている場合)
スキーマ名と一致する許可 ID には、暗黙的にそのスキーマの CREATEIN 特権があります。
関数の作成に使用される許可 ID にインストール SYSADM 権限またはインストール SYSOPR 権限があり、現行の SQLID が SYSINSTL に設定されている場合、関数はシステム定義関数として識別されます。
ユーザー定義タイプが参照される場合 (パラメーターのデータ・タイプ)、特権セットには、以下のうち少なくとも 1 つの特権も含まれている必要があります。
- ユーザー定義タイプの所有権
- ユーザー定義タイプに対する USAGE 特権
- SYSADM 権限
- SECADM 権限
- CREATE_SECURE_OBJECT 特権
特権セット:
アプリケーション・プログラムにこの ステートメントを組み込む場合、特権セットは、プランまたはパッケージの所有者が持つ特権となります。 所有者がロールである場合、暗黙的なスキーマの一致は適用されず、また、このロールは上にリストした条件のうちのいずれかを満たしていなければなりません。
このステートメントが動的に準備され、かつ、ROLE AS OBJECT OWNER 文節が指定されたトラステッド・コンテキストの中で実行されていない場合、この特権セットは、プロセスの SQL 許可 ID が持つ特権のセットとなります。 スキーマ名がプロセスの SQL 許可 ID と異なる場合、下記の条件のいずれか 1 つが満たされていなければなりません。
- 特権セットに SYSADM または SYSCTRL 権限が含まれている。
- プロセスの SQL 許可 ID に、スキーマの CREATEIN 特権がある。
CREATE FUNCTIONの構文(インラインSQLスカラー)
parameter-declaration:
データ・タイプ:
built-in-type:
関数定義:
option-list:
SQL-routine-body:
CREATE FUNCTION(インラインSQLスカラー)の説明
- 関数名
- ユーザー定義関数の名前を指定します。 この名前は、スキーマ名によって暗黙的または明示的に
修飾されます。 詳細については、 「CREATE FUNCTION ステートメント (概要)」 の
「スキーマ名と関数名の選択」
および「スキーマ内の関数の一意性の決定」を
参照してください。 - (パラメータ宣言、…)
関数の入力パラメーターの数と名前と各パラメーターのデータ・タイプを指定します。 各 parameter-declaration は、関数の入力パラメーターを指定します。 入力パラメーターは、関数の中にいくつ指定しても かまいません。 関数が受け取ると予期しているパラメーターには、それぞれリスト内に 1 個の項目 が必要です。 関数のパラメーターはすべて入力パラメーターで、NULL 可能です。 関数に 30 個を超えるパラメーターが指定されている場合、最初の 30 個のパラメーターだけが、関数が固有であるかどうかの判別に使用されます。
- パラメーター名
- 入力パラメーターの名前を指定します。 この名前は SQL ID で、 パラメーター・リスト内のそれぞれの名前は他のどの名前とも同じであってはなりません。
- データ・タイプ
- 入力パラメーターのデータ・タイプを指定します。 データ・タイプは、組み込みデータ・タイプまたはユーザー定義タイプにすることができます。
- 一体型
入力パラメーターのデータ・タイプは組み込みデータ・タイプです。 組み込みデータ型の説明については、 CREATE TABLE文の built-in-type のデータ型と説明を参照してください。
文字データ・タイプまたはグラフィック・データ・タイプのパラメーターの場合は、PARAMETER CCSID 文節または CCSID 文節によってパラメーターのコード化スキームを指定します。 これらの文節をいずれも指定しない場合、コード化スキームはインストール・パネル DSNTIPF の DEF ENCODING SCHEME フィールドの値です。
- 型名明確
- 入力パラメーターのデータ・タイプは特殊タイプです。 パラメーターの長さ、
精度、位取り、サブタイプ、またはコード化スキームの各属性は、いずれも特殊タイプのソース・タイプの属性です。 特殊タイプは、LOB データ・タイプに基づくものであってはなりません。
スキーマ名を指定せずに特殊タイプの名前を指定すると、Db2は SQL パス内のスキーマを検索することによって、特殊タイプを解決します。
文字ストリングまたはグラフィック・ストリング・データ・タイプのすべてのパラメーターの暗黙的または明示的に指定されたコード化スキームは、同じ (すべてが ASCII か EBCDIC か UNICODE) でなければなりません。
文字データ・タイプのパラメーターにはサブタイプ (BIT、SBCS、または MIXED) が 暗黙的または明示的に指定されていますが、関数プログラムは任意のサブタイプの 文字データを受け取ることができます。 したがって、関数が呼び出されると、入力データからパラメーターのサブタイプへの変換が起こる場合があります。 実際に DBCS 文字を含む混合データを SBCS サブタイプで宣言されている入力パラメーターの値に使用すると、エラーが起こります。
日時データ・タイプまたは特殊タイプのパラメーターは、異なるデータ・タイプとして 関数に渡されます。
- 日時タイプ・パラメーターは文字データ・タイプとして渡され、データは ISO 形式
で渡されます。
日時タイプ・パラメーターのコード化スキームは、任意の文字ストリングまたはグラフィック・ストリング・パラメーターの暗黙的または明示的に指定されたコード化スキームと同じです。 文字またはグラフィック・ストリング・パラメーターが渡されない場合、コード化スキームは、 インストール・パネル DSNTIPF の DEF ENCODING SCHEME フィールドの値になります。
- 特殊タイプのパラメーターは、特殊タイプのソース・タイプとして受け渡されます。
- RETURNS
- 関数の出力を指定します。
- data-type2
- 出力のデータ・タイプを指定します。 出力は NULL 可能です。
入力パラメータのデータタイプに適用されるのと同じ考慮事項が、データタイプで 「データタイプ」 の項で説明されているように、関数の出力のデータタイプにも適用されます。
- LANGUAGE SQL
- この関数は SQL でのみコーディングされていることを指定します。
- SPECIFIC 特定名
- 関数の固有の名前を指定します。 この名前は、スキーマ名によって暗黙的
または明示的に修飾されます。 名前 (スキーマ名を含む) は、現行サーバーに存在する他の関数の特
定名であってはなりません。
specific-name の非修飾形式は SQL ID です。 修飾形式は、SQL ID (スキーマ名) の後にピリオドと SQL ID が続く形式です。
スキーマ名を指定しないと、関数名 (function-name) の 明示的または暗黙的スキーマ名と同じになります。 スキーマ名を指定する場合は、 関数名の明示的または暗黙的スキーマ名と同じでなければなりません。
SPECIFIC 文節を指定しないと、デフォルトの特定名は関数の名前と同じになります。 ただし、関数名に固有の名前が指定されていない場合、または関数名が単一のアスタリスクの場合、Db2は以下の形式で特定の名前を生成します。
ここで、SQLxxxxxxxxxxxx'xxxxxxxxxxxx'は、名前を固有にする 12 文字のストリングです。特定名は SYSROUTINES カタログ表の SPECIFIC 列に保管されます。 特定の名前を使用して、いくつかの SQL ステートメント (ALTER FUNCTION、COMMENT、DROP、GRANT、および REVOKEなど) で関数を一意的に識別することができます。また、Db2コマンド (START FUNCTION、STOP FUNCTION、および DISPLAY FUNCTION) で使用する必要があります。 ただし、関数をその特定名で呼び出すことはできません。
- PARAMETER CCSID
- 文字およびグラフィックのストリング・パラメーターのコード化スキームが ASCII、EBCDIC、または UNICODE のいずれであるかを指定します。 デフォルトのコード化スキームは、パラメーター・リストの CCSID 文節
か、または RETURNS 文節で指定されている値、またはインストール・パネル DSNTIPF の
フィールド DEF ENCODING SCHEME で指定されている値になります。
この文節を使用すると、文字およびグラフィック・ストリング・パラメーターに対してコード化スキーム を容易に指定することができます。 この PARAMETER CCSID 文節のほかに個々のパラメーターに対して 個別に CCSID 文節が指定されている場合、すべての CCSID 文節で指定 されている値が、この文節で指定されている値と同じでなければなりません。
この文節は、メッセージ・トークンおよび DBINFO などのルーチンのシステム生 成パラメーターに使用されるコード化スキームも指定します。
- NOT DETERMINISTIC または DETERMINISTIC
- 関数が同じ入力引数を指定して呼び出されるたびに、その関数が同じ結果を戻すかどうかを指定します。
- NOT DETERMINISTIC
- 関数は、同じ入力引数を指定して呼び出されるたびに同じ結果を戻さない場合があります。 関数は、結果に影響する状態値によって左右されます。 Db2 この情報を使用して、この関数を参照するSELECTおよびSQLデータ変更文を処理する際に、ビューとテーブル式の結合を無効にします。 deterministic ではない (常には同じ結果が戻されない) 関数の例としては、
乱数を生成する関数があります。
関数プログラムが特殊レジスターにアクセスする場合、または別の非 deterministic 関数を呼び出す場合は、NOT DETERMINISTIC を明示的または暗黙的に指定する必要があります。 NOT DETERMINISTIC がデフォルトです。
- DETERMINISTIC
- 関数は、同じ入力引数を指定して呼び出されるたびに常に同じ結果関数を戻します。 deterministic 関数の例としては、入力の平方根を計算する関数があります。 Db2 この情報を使用して、この関数を参照するSELECTおよびSQLデータ変更文のビューとテーブル式のマージを可能にします。 DETERMINISTIC はデフォルトではありません。 適用できる場合は、この関数を参照する SQL ステートメントに対して最適でないアクセス・パスが選択されることを防ぐために、DETERMINISTIC を指定してください。
Db2は、関数プログラムが DETERMINISTIC または NOT DETERMINISTIC の指定と一致していることを検査しません。
- EXTERNAL ACTION または NO EXTERNAL ACTION
- Db2が管理しないオブジェクトの状態を変更するアクションを関数が実行するかどうかを指定します。 外部アクションの例としては、メッセージの送信やファイルへのレコードの書き込みがあります。
- EXTERNAL ACTION
- この関数は、Db2が管理しないオブジェクトの状態を変更するアクションを実行できます。
外部アクションで関数を呼び出す SQL ステートメントの中には、並列タスクが その関数を実行すると、誤った結果になるものがあります。 例えば、初期呼び出しを受けるたびに注釈を送信する関数の場合、関数ごとに 1 つの注釈が送信されるのではなく、並列タスクごとに 1 回ずつ送信されることになります。 並列処理を正しく扱うことのできない関数については、DISALLOW PARALLEL 節を指定します。
EXTERNAL ACTION を指定した場合、Db2:
- 関数を参照する SELECT ステートメントと SQL データ変更ステートメントのビューと表式をマテリアライズします。 このマテリアライズは、この関数を参照する SQL ステートメントに対して選択されるアクセス・パスに悪影響を及ぼす可能性があります。 関数が外部アクションを行わない場合は、EXTERNAL ACTION を指定しないでください。
- FETCH 操作間で、関数を 1 つのタスク制御ブロック (TCB) から別の TCB へ移 動しません。
- カーソルがクローズされるまで、別の関数またはストアード・プロシージャーによる TCB の使用を許可しません。 これは、WITH HOLD と宣言されたカーソルについてもあてはまります。
コミットおよびロールバック操作の制御下にあるDb2の外部で行われたリソースへの唯一の変更は、RRS の制御下で行われた変更です。
SQL ルーチン本体が EXTERNAL ACTION を指定して定義された関数を呼び出す場合は、EXTERNAL ACTION を暗黙的または明示的に指定する必要があります。 EXTERNAL ACTION がデフォルトです。
- NO EXTERNAL ACTION
- この関数は、 Db2 が管理していないオブジェクトの状態を変更するような処理は一切行いません。 Db2 この情報を使用して、この関数を参照するSELECTおよびSQLデータ変更文のビューとテーブル式のマージを可能にします。 適用できる場合は、この関数を参照する SQL ステートメントに対して最適でないアクセス・パスが選択されることを防ぐために、NO EXTERNAL ACTION を指定してください。
グローバル変数の有効範囲は、ルーチンの範囲外ですが、NO EXTERNAL ACTION を指定すると、グローバル変数をルーチン本体に設定することができます。
Db2は、関数プログラムが EXTERNAL ACTION または NO EXTERNAL ACTION の指定と一致しているかどうかを検査しません。
- SQL データを読み込み、または CONTAINS SQL
- このルーチンが実行または呼び出すことができる SQL ステートメントおよびネストされたルーチンの分類を指定します。 データベース・マネージャーは、関数によって発行される SQL ステートメント、およびルーチンによってローカルに呼び出されるすべてのルーチンが、この指定と一致していることを検証します。ネストされたリモート・ルーチンが呼び出される場合、この検証は実行されません。 各文の分類については、 ルーチンのSQL文データアクセス分類を参照してください。
- READS SQL DATA
- この関数が、データ・アクセス種別 READS SQL DATA、CONTAINS SQL、または NO SQL のステートメントを実行できるように指定します。 この関数は、データの変更を行う SQL ステートメントは実行できません。
READS SQL DATA がデフォルトです。
- CONTAINS SQL
- この関数が、データ・アクセス種別 CONTAINS SQL または NO SQL の SQL ステートメントのみを実行できるように指定します。 この関数は、データの読み取りまたは変更を行う SQL ステートメントを実行できません。
- 静的ディスパッチ
- 関数解決時には、Db2は関数パラメーターの静的 (または宣言された) タイプに基づいて関数を選択します。 STATIC DISPATCH がデフォルトです。
- NULL入力の場合
- いずれかの引数値またはすべての引数値が NULL の場合に、関数が呼び出されることを指定します。 CALLED ON NULL INPUT を指定するには、NULL 引数値をテストするために関数本体をコーディングする必要があります。
CALLED ON NULL INPUT がデフォルトです。
- NOT SECURED または SECURED
- 関数が行アクセス制御と列アクセス制御においてセキュアであると見なされるかどうかを指定します。 この関数の今後のすべてのバージョンには SECURED オプションまたは NOT SECURED オプションが適用されます。
- NOT SECURED
- 関数が行アクセス制御と列アクセス制御においてセキュアであると見なされないことを指定します。
NOT SECURED がデフォルトです。
表でアクティブな列アクセス制御が使用されている場合、関数の呼び出し時に、関数の引数が、列マスクが有効になっている列を参照してはなりません。
- SECURED
- 関数が行アクセス制御と列アクセス制御においてセキュアであると見なされることを指定します。
行の許可または列マスクで参照されている関数はセキュアでなければなりません。
- SQL-routine-body
- 単一の RETURN ステートメントを指定します。 詳細は、 RETURNステートメントを参照してください。
RETURN ステートメントにスカラー全選択が含まれている場合は、Db2はコンパイル済み関数を定義しようとします。 詳細はCREATE FUNCTION文(コンパイルされたSQLスカラー関数 )を参照してください。
どのタイプの SQL スカラー関数が作成されるかを判別するには、SYSIBM.SYSROUTINES カタログ表の INLINE 列を参照してください。
- WRAPPED 難読化されたステートメントテキスト
- 関数のエンコード定義を指定します。 WRAP スカラー関数を使用して CREATE FUNCTION ステートメント
をエンコードできます。
WRAPPED は、静的 CREATE ステートメントに指定してはなりません。
CREATE FUNCTION(インラインSQLスカラー)に関する注意事項
- すべてのタイプのユーザー定義関数に関する考慮事項:
- すべての種類のユーザー定義関数に共通する事項については、「CREATE FUNCTION ステートメント(概要)」 を参照してください。
- SQL スカラー関数のタイプ:
- CREATE FUNCTION ステートメントの構文が、CREATE FUNCTION (インライン化された SQL スカラー) の構文図と説明に準拠している場合、Db2はインライン化関数を定義し、パッケージは作成されません。 インライン化された SQL スカラー関数が呼び出されると、関数の RETURN ステートメントの expression が照会自体にコピー (インライン化) され、関数は呼び出されません。 インライン化されたSQLスカラー関数の属性は、CREATE FUNCTION文(インライン化されたSQLスカラー関数 )で説明されています。
それ以外の場合、Db2は、コンパイル済み関数を関連パッケージで定義しようとします。 例えば、RETURN ステートメントにスカラー全選択が含まれている場合、Db2は、コンパイル済み関数を定義しようとします。 コンパイルされたSQLスカラー関数の属性はCREATE FUNCTION文(コンパイルされたSQLスカラー関数 )で説明されています。
どのタイプの SQL スカラー関数が作成されるかを判別するには、SYSIBM.SYSROUTINES カタログ表の INLINE 列を参照してください。 INLINE 列の値が Y の場合、関数はインライン化された関数であることを示し、値が N の場合、関数はコンパイルされた関数であることを示します。
- MODIFIES SQL DATA で定義された関数に関する考慮事項:
- サブセレクトで関数が指定され、その関数が次のように定義されている場合、 MODIFIES SQL DATA、その関数が呼び出される回数は、使用されるアクセス計画によって異なります。
- 自己参照関数:
- SQL 関数の本体 (つまり、CREATE FUNCTION ステートメントの本文にある RETURN ステートメントの expression または NULL) には、それ自体の再帰的呼び出しや、それを呼び出す別の関数に対する再帰的呼び出しを指定することはできません。このような関数は、参照の目的で存在しないからです。
- 従属オブジェクト:
- SQL ルーチンは、ルーチン本体で参照されているオブジェクトに従属します。
- 難読化されたステートメント:
- CREATE FUNCTION ステートメントは、難読化された形式で実行できます。 難読化されたステートメントでは、関数名、パラメーター、および WRAPPED キーワードのみが読み取り可能です。 ステートメントのその他の部分は、読み取り不能な、しかも難読化ステートメントをサポートするデータベース・サーバーでデコード可能な方法でエンコードされます。 WRAP スカラー関数は、難読化されたステートメントを作成します。 難読化されたステートメントから関数が 作成されるときに指定されるデバッグ・オプションはすべて無視されます。
- オブジェクト名の解決:
- Db2 無修飾オブジェクト名の解決とオブジェクトの型に従って、関数本体内のオブジェクト名を解決します。 ネーム解決は、関数の作成時に行われます。
- パーティション境界を指定せずに作成した表に対するパーティション索引の作成:
- SQL 関数に日付/時刻特殊レジスターへの参照が複数含まれている場合、すべての参照は同じ値を戻します。 さらに、この値は、関数を呼び出したステートメント内の特殊レジスターの取り出し値によって戻される値と同じ値です。
- 代替構文およびシノニム:
- Db2ファミリー内の以前のリリースのDb2または他の製品との互換性を提供するために、Db2は以下の代替構文をサポートしています。
- NOT DETERMINISTIC のシノニムとして VARIANT
- DETERMINISTIC のシノニムとして NOT VARIANT
- CALLED ON NULL INPUT のシノニムとして NULL CALL
- TIMEZONE は、 TIME ZONE の代替として指定できます。
インライン化された SQL スカラー関数では、RETURNS 文節、および option-list 内の文節は任意の順序で指定できます。

- AI スカラー関数の使用に関する制約事項:
- スカラー関数AI_ANALOGY、AI_COMMONALITY、AI_SEMANTIC_CLUSTER、AI_SIMILARITYはインライン関数では使用できません。 AI 関数はモデル列を参照する必要があります。モデル列をインライン関数定義で指定することはできません。 AI 関数が関数の RETURN ステートメントのスカラー全選択の内部に現れる場合、その関数は上記のようにコンパイル済み SQL スカラー関数として作成され、AI 関数の使用が許可されます。

CREATE FUNCTION(インラインSQLスカラー)の例
CREATE FUNCTION TAN (X DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
CONTAINS SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN SIN(X)/COS(X);