データベース関数 とは、 一連の入力データの値と一連の結果の値との間の関係です。 たとえば TIMESTAMP 関数は、 入力データ値として DATE および TIME データ・タイプを受け取り、 TIMESTAMP の結果を生成します。 関数には組み込み関数とユーザー定義関数があります。
ユーザー定義関数の使用により、DB2 ではユーザーおよびアプリケーションの開発者は、 ユーザーもしくは他社によって提供された関数定義を追加することによってデータベース・システムの関数を拡張して、 データベース・エンジン自体に適用することができます。 これにより、データベースから行を検索し、 検索されたデータに関数を適用してさらに修飾するかまたはデータ整理を実行する場合よりも、 パフォーマンスを高めることができます。 また、データベース関数を拡張することにより、 データベースはアプリケーションが使用するのと同じ関数をエンジンで活用することができ、 アプリケーションとデータベースとの間の共同作用が高まり、 またオブジェクト指向性が高まるためにアプリケーション開発者にとって生産性向上に役立ちます。
SYSIBM および SYSFUN スキーマの関数のリストは、表 15 に示されています。
ユーザー定義関数は、外部関数、SQL 関数、 またはソース関数 とすることができます。 外部関数 は、 オブジェクト・コード・ライブラリーと関数呼び出し時に実行されるそのライブラリー内の関数によってデータベースに対して定義されます。 列関数を外部関数にすることはできません。 ソース関数からの派生関数 は、 データベースがすでに認識している別の組み込み関数またはユーザー定義関数への参照によって、 データベースに対して定義されます。 ソース関数からの派生関数はスカラー関数または列関数です。 これらは、ユーザー定義タイプの既存の関数を使用する場合のサポートにきわめて有用です。 SQL 関数 は、SQL RETURN ステートメントだけを使用して、 データベースに対して定義されます。 スカラー値、行、または表のいずれかを戻すことができます。 SQL 関数を、列関数とすることはできません。
各ユーザー定義関数は、スカラー関数、 列関数、 または表関数 として類別することもできます。
スカラー関数 は、 呼び出されるたびに単一値の応答を戻す関数です。 たとえば、組み込み関数 SUBSTR() はスカラー関数です。 スカラー UDF は、外部関数またはソースからの派生関数のいずれであってもかまいません。
列関数 は、概念上、類似値の集合 (列) を渡され、 単一値の応答を戻す関数です。 DB2 では、場合によっては総計関数 と呼ばれることもあります。 列関数の例として、組み込み関数 AVG() があります。 外部列 UDF を DB2 に対して定義することはできませんが、 組み込み列関数のいずれかをソースとして派生する列 UDF を定義することができます。 これは、特殊タイプに対して有用です。 たとえば、特殊タイプ SHOESIZE が基本タイプ INTEGER を使用して定義されている場合、 組み込み関数 AVG(INTEGER) をソースとする UDF AVG(SHOESIZE) を定義することができ、 これは列関数になります。
行関数 とは、値を一行で戻す関数です。 これは、構造タイプの属性値を行の値に割り当てる変形関数としてのみ、使うことができます。 行関数は、SQL 関数として定義する必要があります。
表関数 は、その関数を参照する SQL ステートメントに表を戻す関数です。 SELECT の FROM 文節でのみ参照することができます。 このような関数を使用して、DB2 データ以外のデータに SQL 言語処理能力を適用することや、 このようなデータを DB2 表に変換することができます。 たとえば、ファイルを取り出してそれを表に変換することや、 WWW からデータをサンプリングしてそれを表にすること、 あるいは Lotus Notes データベースにアクセスして、日付、送信元、 メッセージのテキストなどのすべてのメール・メッセージに関する情報を戻すこと、 などを行うことができます。 このような情報は、データベースの他の表と結合することができます。 表関数は、外部関数または SQL 関数として定義できます (表関数を、 ソースから派生される関数にすることはできません)。
関数は、そのスキーマ、関数名、パラメーター数、 およびそのパラメーターのデータ・タイプによって識別されます。
これは関数シグニチャー と呼ばれ、 データベース内で固有である必要があります。 パラメーターの数やパラメーターのデータ・タイプが違っていれば、 1 つのスキーマに同じ名前の関数が複数存在してもかまいません。 複数の関数インスタンスのある関数名は、 多重定義 関数と呼ばれます。 ある関数名があるスキーマ内で多重定義される場合、 そのスキーマにはその名前で 2 つ以上の関数があるということです (パラメーター・タイプが異なっているものでなければなりません)。 関数名は SQL パスにおいても多重定義可能です。 その場合、そのパスにその名前の関数が 2 つ以上ありますが、 必ずしもパラメーター・タイプが異なる必要はありません。
関数は、使用可能な文脈で、 その後に括弧に入った引き数のリストを伴うその修飾名 (スキーマ名および関数名) を参照することによって、 呼び出すことができます。 また、スキーマ名を指定せずに関数を呼び出すことも可能であり、 その場合は、異なるスキーマの関数のうち、 同じパラメーターまたは許容可能なパラメーターをもつ可能な関数を選択できることになります。 このような場合、 関数解決 に役立つ SQL パス が使用されます。 SQL パスとは、同じ名前、同じパラメーター数、 および受け入れ可能なデータ・タイプを持つ関数を識別するために探索されるスキーマのリストです。 静的 SQL ステートメントに対する SQL パスは、 FUNCPATH バインド・オプションを使って指定されます (詳細については、 コマンド解説書 を参照)。 動的 SQLステートメントの場合、 SQL パスは CURRENT PATH 特殊レジスターの値です (CURRENT PATHを参照してください)。