SQL 解説書
CREATE TRANSFORM ステートメントは、
グループ名で識別されるトランスフォーメーション関数を定義します。この関数は、
ホスト言語プログラムおよび外部関数とメソッドを相手に構造タイプ値を交換するのに使います。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、
ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
- SYSADM または DBADM 権限
- type-name で指定されたタイプの定義者と、指定された関数ごとの定義者
構文
>>-CREATE--+-TRANSFORM--+---FOR--type-name---------------------->
'-TRANSFORMS-'
.------------------------------------------------------------------------------------.
| .-,--------------------------------------------------------. |
V V (1) | |
>--------group-name--(------+-TO SQL---+---WITH--| function-specification |--------+---)---+>
'-FROM SQL-'
>--------------------------------------------------------------><
function-specification
|---+-FUNCTION--function-name--+-------------------------------+-+->
| '-(--+-------------------+---)--' |
| | .-,-----------. | |
| | V | | |
| '----data-type---+--' |
'-SPECIFIC FUNCTION--specific-name---------------------------'
>---------------------------------------------------------------|
注:
- 同じ文節を複数回指定することはできません。
説明
- TRANSFORM または TRANSFORMS
- 1 つ以上の変形グループを定義することを指示します。
いずれかのバージョンのキーワードを指定することができます。
- FOR type-name
- 変形グループを定義する対象となるユーザー定義構造タイプの名前を指定します。
動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、
修飾子のない type-name の修飾子として使用されます。
静的 SQL ステートメントでは、QUALIFIER プリコンパイル / バインド・オプションによって、
修飾子のない type-name の修飾子が暗黙指定されます。
この type-name は既存のユーザー定義タイプであり (SQLSTATE 42704)、
しかも構造タイプでなければなりません (SQLSTATE 42809)。
構造タイプまたはこれと同じタイプ階層内の他の構造タイプが、
特定のグループ名を使って変形をすでに定義済みであってはなりません (SQLSTATE 42739)。
- group-name
- TO SQL および FROM SQL 関数をもつ変形グループの名前を指定します。
その名前は固有名である必要はありません。しかし、
その名前の付いた変形グループ (同じ TO SQL や FROM SQL 指示が定義されている) が、
指定の type-name ですでに定義済みであってはなりません (SQLSTATE 42739)。
group-name は、SQL 識別子である必要があり、
長さは最大 18 文字であり (SQLSTATE 42622)、
そして修飾子接頭部が付いていてはなりません (SQLSTATE 42601)。
group-name を接頭部 SYS で始めることはできません。
これは、データベースで使うために予約されているからです (SQLSTATE 42939)。
どのグループに対しても、
FROM SQL と TO SQL 関数のそれぞれの指名を最大で 1 つずつ指定することができます (SQLSTATE 42628)。
- TO SQL
- SQL ユーザー定義構造タイプ・フォーマットに値を変形するのに使用する個々の関数を定義します。
この関数では、すべてのパラメーターを組み込みデータ・タイプとして使用しなければならず、
戻りタイプは type-name です。
- FROM SQL
- SQL ユーザー定義構造タイプを表す組み込みデータ・タイプ値に値を変形するのに使用する個々の関数を定義します。
この関数では、データ・タイプ type-name の 1 つのパラメーターを使う必要があり、
1 つの組み込みデータ・タイプ (または一連の組み込みデータ・タイプ) を戻します。
- WITH function-specification
- 関数インスタンスの指定には、いくつかの方法を使うことができます。
FROM SQL を指定する場合、function-specification に、
次のような要件を満たす関数を指定しなければなりません。
- タイプ type-name の 1 つのパラメーターがある
- 戻りタイプは、組み込みタイプであるか、またはすべてが組み込みタイプの列をもつ行である
- シグニチャーは、LANGUAGE SQL を指定しているか、
または LANGUAGE SQL をもつ別の FROM SQL 変形関数の使用を指定している
TO SQL を指定する場合、function-specification に、
次のような要件を満たす関数を指定しなければなりません。
- すべてのパラメーターに組み込みタイプがある
- 戻りタイプは type-name である
- シグニチャーは、LANGUAGE SQL を指定しているか、
または LANGUAGE SQL をもつ別の TO SQL 変形関数の使用を指定している
メソッド (FUNCTION ACCESS を使って指定したものでも) を、
function-specification を使って変形として指定することはできません。
つまり、CREATE FUNCTION ステートメントで定義されている関数だけが、
変形として作動することができます (SQLSTATE 42704 または 42883)。
さらに、必須ではありませんが、FROM SQL 関数から戻された 1 つ以上の組み込みタイプが、
TO SQL 関数のパラメーターである 1 つ以上の組み込み関数と直接対応しているべきです。
これが、この 2 つの関数の相反する関係の論理的結末です。
- FUNCTION function-name
- 特定の関数を名前で指定します。
function-name (関数名) の関数がちょうど 1 つだけ存在している場合にのみ有効です。
このように指定するプロシージャーには、
任意の数のパラメーターが定義されていても構いません。
動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、
修飾子のないオブジェクト名の修飾子として使用されます。
静的 SQL ステートメントでは、
QUALIFIER プリコンパイル / バインド・オプションにより、
修飾子のないオブジェクト名の修飾子が暗黙指定されます。
指定したスキーマまたは暗黙のスキーマにこの名前の関数が存在しない場合は、
エラー (SQLSTATE 42704) になります。
指定したスキーマまたは暗黙のスキーマに、
この関数の特定インスタンスが複数存在する場合、
エラー (SQLSTATE 42725) になります。
関数選択の標準アルゴリズムは使用されません。
- FUNCTION function-name (data-tape,...)
- 使用する関数を固有に指定する関数シグニチャーを指定します。
関数選択の標準アルゴリズムは使用されません。
- function-name
- 関数の名前を指定します。
動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、
修飾子のないオブジェクト名の修飾子として使用されます。
静的 SQL ステートメントでは、
QUALIFIER プリコンパイル / バインド・オプションにより、
修飾子のないオブジェクト名の修飾子が暗黙指定されます。
- (data-type,...)
- ここで指定するデータ・タイプは、
CREATE FUNCTION ステートメントの対応する位置に指定されたデータ・タイプに一致していなければなりません。
データ・タイプの数、およびデータ・タイプを論理的に連結した値を使って、特定の関数を識別します。
data-type が修飾なしの場合は、SQL パスでスキーマを検索してタイプ名が決定されます。
REFERENCE タイプに指定するデータ・タイプ名にも同様の規則が当てはまります。
パラメーター化データ・タイプの長さ、精度、または位取りを指定する必要はありません。
代わりに、空の括弧をコーディングすることによって、
データ・タイプの一致を調べる際にそれらの属性を無視するように指定することができます。
パラメーター値が異なるデータ・タイプ (REAL または DOUBLE) を示しているため、
FLOAT() を使用することはできません (SQLSTATE 42601)。
ただし、長さ、精度、または位取りをコーディングする場合、
その値は、CREATE FUNCTION ステートメントにおける指定に完全に一致していなければなりません。
0 <n<25 は REAL を意味し、24<n<54 は DOUBLE を意味するので、
FLOAT(n) のタイプは、n に定義された値と一致している必要はありません。
タイプが REAL か DOUBLE かによって、生じる一致は異なってきます。
FOR BIT DATA 属性は、
一致検索のためのシグニチャーの一部とはみなされません。
たとえばシグニチャーの中に CHAR FOR BIT DATA が指定されている場合、
それは CHAR と定義されている関数とだけ一致することになります。
指定したスキーマまたは暗黙のスキーマに、指定したシグニチャーを持つ関数がない場合は、
エラー (SQLSTATE 42883) になります。
- SPECIFIC FUNCTION specific-name
- 関数の作成時に指定された特定関数名、
またはデフォルト値として使用された特定関数名を使用して、
特定のユーザー定義関数を指定します。
動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターは、
修飾子のないオブジェクト名の修飾子として使用されます。
静的 SQL ステートメントでは、QUALIFIER プリコンパイル / バインド・オプションによって、
修飾子のないオブジェクト名の修飾子が暗黙指定されます。
specific-name (特定名) は、
指定したスキーマまたは暗黙のスキーマの特定関数のインスタンスを指定していなければなりません。
そうでない場合、エラー (SQLSTATE 42704) になります。
注
- 静的 SQL の場合は TRANSFORM GROUP プリコンパイル・オプションまたはバインド・オプションを使って、
動的 SQL の場合は SET CURRENT DEFAULT TRANSFORM GROUP ステートメントを使って、
アプリケーション・プログラム内で変形グループを指定しない場合に、
そのアプリケーション・グループが、
type-name で指定されたユーザー定義の
構造タイプに基づいているホスト変数を検索または送信しようとすると、
変形グループ 'DB2_PROGRAM' 内の変形関数が使われます (定義されている場合)。
データ・タイプ type-name の値を検索すると、
FROM SQL 変形が実行され、構造タイプは、
変形関数から戻された組み込みデータ・タイプに変形されます。
同様に、データ・タイプ type-name の値に割り当てられることになるホスト変数を送信すると、
TO SQL 変形が実行され、組み込みデータ・タイプ値は構造タイプ値に変形されます。
ユーザー定義の変形グループを指定しない場合や、
'DB2_PROGRAM' グループ (特定の構造タイプのもの) が定義されていない場合、
エラーが生じます。
- 構造タイプ・ホスト変数を組み込みデータ・タイプで表現したものは、
次のように割り当て可能でなければなりません。
- プリコンパイル・コマンドの指定 (検索割り当て規則を使用) の TRANSFORM GROUP オプションで定義されているとおりの
構造タイプの FROM SQL 変形関数の結果から
- プリコンパイル・コマンドの指定 (記憶域割り当て規則を使用) の TRANSFORM GROUP オプションで定義されているとおりの
構造タイプの TO SQL 変形関数のパラメーターへ
ホスト変数が、該当する変形関数での規定のタイプと互換性のある割り当てでないと、
エラーが起きます (組み込みの場合は SQLSTATE 42821、バインドアウトの場合は SQLSTATE 42806)。
ストリングの割り当てが原因のエラーの詳細は、ストリングの割り当てを参照してください。
- パラメーターまたは戻りタイプとしてデータ・タイプ type-name を使って、
SQL で作成されていないユーザー定義関数を呼び出すと、
そのたびに 'DB2_FUNCTION' という名前のデフォルト変形グループ内で指定されている変形関数が使われます。
これが行われるのは、関数またはメソッドに TRANSFORM GROUP 文節を指定しない場合です。
データ・タイプ type-name の引き数を使って関数を呼び出すと、
FROM SQL 変形が実行され、構造タイプは、
変形関数から戻された組み込みデータ・タイプに変形されます。
同様に、関数の戻りデータ・タイプがデータ・タイプ type-name であると、
TO SQL 変形が実行され、外部関数プログラムから戻された組み込みデータ・タイプ値は、
構造タイプ値に変形されます。
- 構造タイプの中に、やはり構造タイプである属性が入っている場合、
それに関連した変形関数は、
すべてのネストされた構造タイプを繰り返し展開 (またはアセンブル) する必要があります。
つまり、変形関数の結果またはパラメーターは、
サブジェクト構造タイプ (ネストされたすべての構造タイプも含む) のすべての基本属性を表す
一連の組み込みタイプだけで構成されることを意味します。
ネストされた構造タイプを処理するために、
変形関数が「カスケード化」されることはありません。
- このステートメントに指定する 1 つまたは複数の関数は、
このステートメントの実行時に上記の概説どおりの規則に従って解決されます。
これらの関数は、この後の SQL ステートメント内で (暗黙的に) 使用された場合、
これ以外の解決プロセスをたどりません。
このステートメントで定義された変形関数は、
このステートメントで解決されるとおりに記録されます。
- 特定のタイプの属性またはサブタイプを作成または除去したときは、
ユーザー定義構造タイプの変形関数も変更する必要があります。
- ある特定の変形グループについて、FROM SQL 関数と TO SQL 関数を指定できるのは、
同じ group-name 文節、別の group-name 文節、
または別の CREATE TRANSFORM ステートメントのいずれかにおいてです。
既存のグループ定義をあらかじめ除去しておかないと、
FROM SQL 関数または TO SQL 関数の指定を再定義できないことが唯一の制約事項です。
それによって、たとえば、特定のグループの FROM SQL 変形関数を先に定義しておいてから、
後で同じグループ用の対応する TO SQL 変形関数を定義することができます。
例
例 1: ユーザー定義構造タイプの多角形を、
C 用にカスタマイズした変形関数と Java 用に特殊化した変形関数に関連付ける 2 つの変形グループを作成します。
CREATE TRANSFORM FOR POLYGON
mystruct1 (FROM SQL WITH FUNCTION myxform_sqlstruct,
TO SQL WITH FUNCTION myxform_structsql)
myjava1 (FROM SQL WITH FUNCTION myxform_sqljava,
TO SQL WITH FUNCTION myxform_javasql )
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]