ユーザー定義関数の作成

CREATE FUNCTION ステートメントは、ユーザー定義関数をデータベース・サーバーに登録します。

プロシージャー

ユーザー定義関数を作成するには、次のようにします。

作成する関数のタイプを指定して CREATE FUNCTION ステートメントを発行します。
以下のタイプのユーザー定義関数を作成できます。
外部スカラー
この関数はプログラミング言語で書かれ、1 つのスカラー値を戻します。 外部実行可能ルーチン (パッケージ) は、関数の各種属性とともにデータベース・サーバーに登録されます。 関数が呼び出されるたびに、パッケージは1回または複数回実行されます。 CREATE FUNCTION 文(外部スカラー関数 )を参照してください。
外部表
関数はプログラミング言語で作成されます。 この関数は、関数が開始されるたびに一度に 1 行を戻すことにより、開始された副選択に対して表を戻します。 外部実行可能ルーチン (パッケージ) は、関数の各種属性とともにデータベース・サーバーに登録されます。 関数が呼び出されるたびに、パッケージは1回または複数回実行されます。 CREATE FUNCTION 文(外部テーブル関数 )を参照してください。
ソース派生
この関数は、サーバーに存在する別の関数 (組み込み、外部、SQL、またはソース派生のいずれか) を呼び出すことによって実装されます。 この関数は、基礎となるソース関数の属性を継承します。 ソース派生関数には、関連付けられたパッケージがありません。 CREATE FUNCTION 文(ソース関数 )を参照してください。
SQL スカラー
この関数は SQL ステートメントのみで作成され、スカラー値を戻します。 SQL スカラー関数の本体は、SQL プロシージャ言語(SQL PL)で記述されます。 関数は、関数の各種属性と一緒に現行サーバーで定義されます。
Db2は、インライン化およびコンパイルされた 2 つのタイプの SQL スカラー関数をサポートします。
  • インライン化された SQL スカラー関数 には、単純式の値を返す単一の RETURN ステートメントが含まれています。 この関数は照会の一部としては呼び出されません。代わりに、関数の RETURN ステートメントの expression が照会自体にコピー (インライン化) されます。 したがって、インライン化された SQL スカラー関数の場合、パッケージは生成されません。
  • コンパイル済み SQL スカラー関数 は、すべての SQL PL ステートメントを含む、より大きな機能セットをサポートします。 コンパイル済み SQL スカラー関数の場合、パッケージは生成されます。 これには、制御ステートメントを含む関数の本体が入っています。 また、Db2によって生成されたステートメントも含まれています。 関数が呼び出されるたびに、パッケージは1回または複数回実行されます。

SQL スカラー関数の CREATE FUNCTION ステートメントが処理されると、Db2はインライン化された SQL スカラー関数を作成しようとします。 関数がインライン関数として作成できない場合、Db2はコンパイル済み SQL スカラー関数を作成しようとします。 これらの関数の構文とルールに関する詳細は、「CREATE FUNCTION ステートメント(インライン SQL スカラー関数 )」および 「CREATE FUNCTION ステートメント(コンパイルされた SQL スカラー関数 )」を参照してください。

どのタイプの SQL スカラー関数が作成されるかを判別するには、SYSIBM.SYSROUTINES カタログ表の INLINE 列を参照してください。

SQL 表
この関数は SQL RETURN ステートメントのみで作成され、行セットを返します。 SQL 表関数の本体は SQL プロシージャー型言語でコーディングされています。 この関数は、現行サーバーでさまざまな属性と一緒に定義されます。 この関数は、照会の一部として呼び出されません。 その代わりに、関数の RETURN ステートメントのは、照会自体にコピー (インライン化) されます。 そのため、SQL 表関数に対してパッケージは生成されません。 CREATE FUNCTION 文(SQL テーブル関数 )を参照してください。

汎用プログラミングインターフェース情報の開始。

下記の 2 つの例では、ユーザー定義関数と特殊タイプの両方の定義方法と使用方法を分かりやすく記載してあります。

例 1
EUROEMP と呼ばれる表を定義すると仮定します。 この表の 1 つの列 (EUROSAL) は、EURO の特殊タイプであり、DECIMAL(9,2) に基づいています。 EUROSAL の平均値を見つける組み込み AVG 関数は使用できません。その理由は、AVG が組み込みデータ・タイプのみに基づいて機能するからです。 ただし、以下のようにして、組み込みの AVG 関数を基にそれを原型にした AVG 関数を定義して、タイプ EURO の引数を受け取ることはできます。
CREATE FUNCTION AVG(EURO)
  RETURNS EURO
  SOURCE SYSIBM.AVG(DECIMAL);
例 2
次にこの関数を使用して、EUROSAL 列の平均値を求めることができます。
SELECT AVG(EUROSAL) FROM EUROEMP;

次の 2 つの例では、外部的なユーザー定義関数の定義方法と使用方法を分かりやすく記載してあります。

例 3
REVERSE という名の関数の定義と作成を行って、ストリングの中にある文字を反転させると仮定します。 この定義は以下の例のとおりです。
CREATE FUNCTION REVERSE(VARCHAR(100))
  RETURNS VARCHAR(100)
  EXTERNAL NAME 'REVERSE'
  PARAMETER STYLE SQL
  LANGUAGE C;
例 4
次に、以下の例に示すとおり、文字の引数を受け入れるどのような組み込み関数を使用する場合でも、SQL ステートメントの中でこの REVERSE 関数を使用できます。
SELECT REVERSE(:CHARSTR)
  FROM SYSDUMMY1;

ユーザー定義の集約関数を作成することはできませんが、組み込みの集約関数を基にした原型のあるユーザー定義の集約関数を定義することができます。 この機能が役に立つのは、別の名前を使って既存のユーザー定義関数を参照したい場合、または特殊タイプを受け渡したい場合です。

次の 2 つの例では、ユーザー定義の表関数の定義方法と使用方法を分かりやすく記載してあります。

例 5
ユーザーが SELECT ステートメントの FROM 文節の中で呼び出すことができるユーザー定義の表関数の定義と作成を行うことができます。 例えば、BOOKS という名の関数の定義と作成を行うものと仮定します。 この関数では、指定された件名に関するブック情報の表を戻します。 この定義は以下の例のとおりです。
CREATE FUNCTION BOOKS     (VARCHAR(40))
  RETURNS TABLE (TITLE_NAME     VARCHAR(25),
                 AUTHOR_NAME    VARCHAR(25),
                 PUBLISHER_NAME VARCHAR(25),
                 ISBNNO         VARCHAR(20),
                 PRICE_AMT      DECIMAL(5,2),
                 CHAP1_TXT      CLOB(50K))
  LANGUAGE COBOL
  PARAMETER STYLE SQL        
  EXTERNAL NAME BOOKS;
例 6
次に、SELECT ステートメントの FROM 文節の中で BOOKS 関数を組み込んで、ブック情報を検索できます。以下にその例を示します。
SELECT B.TITLE_NAME, B.AUTHOR_NAME, B.PUBLISHER_NAME, B.ISBNNO
  FROM TABLE(BOOKS('Computers')) AS B
  WHERE B.TITLE_NAME LIKE '%COBOL%';
汎用プログラミングインターフェース情報の終了。