2014.07.23
Michael Sansoterra著

DB2 for i 7.2の関数

新DB2 for i 7.2 のフィーチャーに関して、ユーザー定義関数(UDF)のフィーチャーで注目に値する項目に触れたいと思います。このフィーチャー・リストでは変換規則、名前付き引数、パラメータ・デフォルト、及び配列パラメーターに基づいて関数の名称がどのように解決されているかを説明します。

関数の名前解決

ユーザー定義関数が使用できるようになったV4R4の時代から、私は強い不平を抱いていました。不平の種は、DB2がユーザーの使いたい関数を理解しようとするその方法に対してです。

ひとつの関数が多重定義される可能性のあることを念頭に置いてください。これはスカラーUDF ConvertDataは、パラメーター・シグニチャーが固有である限り、DB2 for iで数回定義される可能性のあることを意味します。

唯一、多重定義を制限するのは、入力パラメーターの数字が異なっていなければならないこと、あるいはパラメーターが非互換性のデータタイプを有していることです。上記の例で、最初の関数はDEC(7,0)パラメーターを受け入れ、その他はVARCHAR(8)を受け容れます。しかしながら、タイプINTの単一入力パラメーターによって第三の関数の多重定義を作ることはできません。理由は、INTとDEC(7,0)は類似した互換タイプであり、またDB2はどの関数が使われようとしていたかを識別する能力が無いからです。

内部で、DB2は各関数が固有の識別子を有していることを確認するために特定の名称を使います。もし、特定の名称がCREATE FUNCTIONステートメント上に無ければ、DB2は自動的に割り当てます。

しかしながら、問題は下記のようなUDFを使っているカラム表示を持っているときです。

DB2は使用する関数をどのようにして知るのでしょうか。DB2は要求された関数の名称とその関数に与えられているパラメーターの値に目を向けて、登録されている関数の中に互換性を持つデータタイプのパラメーター及び同じ名称の関数が無いかを調べます。重ねて言いますが、DB2は単に名称によって関数を探すのではなく、名称とパラメーターのシグネチャ(つまりパラメーターの数やそれらのデータタイプ)によって関数を探します。

したがって、DB2が関数の名称を決めようとしたとき、難しさが有ったのです。
例えば、関数ACTION_NAMEを考えてみてください。

DB2 for i 7.2以前にこの関数を起動させるとき、DB2は関数が見つからないと応答したことでしょう。

何が起きているのでしょうか。DB2は'x'をVARCHAR(1)データタイプと見ました。これでは関数が望んだCHAR(1)のデータタイプと合致しません。可能な解決方法は、関数のデータタイプをCHAR(1)からVARCHAR(1)に変更するか、あるいはCAST定数値、この関数を起動するときの正しいタイプに変更することです。

大変面倒なことです。しかしながら、今7.2でDB2はキャスト・ルールを使ってこの関数を見つけ出す作業を行います。換言すれば、関数を探すときキャスト・ルールによって許されているすべてのデータタイプのバリエーションで与えられているパラメーター値をチェックします。いまキャストできるデータタイプによるパラメーターは特別に何をしなくてもUDFを起動するのに使うことができます。

SMALLINTパラメーターに向けてデモンストレートすることができます。

これは定数値12と2012がINTsとして扱われたために起動が頻繁に失敗したものです。

いまもちろんDB2はこの要求を問題無く処理します。

DB2がどのように関数の名称を解決するかについて、さらに詳しくはSQL Referenceマニュアルの以下のセクションをご覧ください。
Function Resolution, Promoting Data Types 及び Determining the Best Fit

名前付きパラメーターとパラメーターのデフォルト

関数のパラメーターは下記の例に示すとおり、ストアド・プロシージャのように、定義する際にデフォルトの値を持つことができるようになりました。GETPAYRATE UDFは、極めて少ない情報に基づいて従業員の変動する支払率を検索するのに使われます。しかしながらほとんどの場合、パラメーター情報のすべてを必要とはしません。このパラメーターは主に支払率を決定するときに特別のケースとして存在します。

この関数を起動するとき、各パラメーターにはその関数にパラメーターのデフォルト値を使うことを教える値あるいは[default]キーワードが渡されます。もしパラメーターがデフォルトを有していれば、明示的な値を与える必要はありません。

関数を起動させて定義されたデフォルト値のすべてを受け入れます。

従業員のidを渡します。欠けているパラメーターはデフォルトです。

さらに、この関数を使うとき、パラメーターは⇒シンタックスを使って呼び出し名称が付せられます。デフォルト値を有していないすべてのパラメーターは関数が呼び出されるとき値が与えられなければなりません。以下は、異なる方法で、パラメーター名を使って関数を起動できる例です。

従業員id、異動、採用日を与えます。

従業員 idとデフォルトの異動だけを与えます。

ひとつの関数が5個あるいはそれ以上のパラメーターを得ると、どのパラメーターが リストの何処に有るかを追跡するのは通常骨の折れる作業です。位置でパラメーターを渡すとき、パラメーター・リストの変更は変更されるすべての参照が要求されます。

パラメーター名の参照はコードを容易に理解するのに役立ち、また変更が行われている場合のメンテナンス労力を軽減するのに役立ちます。デフォルト値を特定することはパラメーターが省略され、関数のSQLが整頓されます。

ARRAYパラメーターのサポート

スカラー関数は配列データタイプでパラメーターを受け取ることができます。下記の配列タイプとUDFはこのことを示しています。

上記のとおり、この関数は12のエレメント配列を受け、そのエレメントをSUMして最終的な値を返します。配列はDB2 for iの実用性を高めました。スカラー関数による使用が可能であるからです。

これらDB2 for iのユーザー定義関数の改善は、開発者がコードを書き、維持するのをいっそう効率化することに向かって長い道のりを歩んでゆくことになるでしょう。

著者Michael Sansoterraは、ミシガン州、Broadway Systemsにおけるデータベース管理者です。

ページトップ

ボタン