CREATE TRANSFORM ステートメント

CREATE TRANSFORM ステートメントは、 グループ名で識別されるトランスフォーメーション関数を定義します。この関数は、 ホスト言語プログラムおよび外部関数を相手に構造化タイプ値を交換するために使います。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • type-name で指定されたタイプの所有者と、指定された関数ごとの EXECUTE 特権
  • type-name で指定されたタイプの所有者と、指定されたすべての関数を含むスキーマに対する EXECUTEIN 特権
  • タイプ名によって識別されるタイプの所有者、および指定されたすべての関数を含むスキーマに対する DATAACCESS 権限
  • type-name が含まれるスキーマに対する SCHEMAADM
  • DBADM 権限

構文

Read syntax diagramSkip visual syntax diagramCREATE TRANSFORMTRANSFORMS FORtype-namegroup-name(,TO SQLFROM SQLWITHfunction-designator1)
function-designator
Read syntax diagramSkip visual syntax diagramFUNCTIONfunction-name(,data-type)SPECIFIC FUNCTIONspecific-name
Notes:
  • 1 The same clause must not be specified more than once.

説明

TRANSFORM または TRANSFORMS
1 つ以上のトランスフォーム・グループを定義することを指示します。 いずれかのバージョンのキーワードを指定することができます。
FOR タイプ名
トランスフォーム・グループを定義する対象となるユーザー定義構造化タイプの名前を指定します。

動的 SQL ステートメントでは、非修飾 type-nameの修飾子として CURRENT SCHEMA 特殊レジスターが使用されます。 静的 SQL ステートメントでは、QUALIFIER プリコンパイル/BIND オプションによって、 修飾子のない type-name の修飾子が暗黙指定されます。 この type-name は既存のユーザー定義タイプであり (SQLSTATE 42704)、 しかも構造化タイプでなければなりません (SQLSTATE 42809)。 構造化タイプまたはこれと同じタイプ階層内の他の構造化タイプが、 特定のグループ名を使ってトランスフォームを既に定義済みであってはなりません (SQLSTATE 42739)。

group-name
トランスフォーム・グループに名前を付けます。 これは、1 部構成の名前です。 これは、SQL ID です (通常 ID または区切り ID)。 group-name は、指定された type-name のカタログに既に存在するトランスフォーム・グループを指定するものであってはなりません (SQLSTATE 42739)。 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 関数指定子
トランスフォーム関数を一意的に識別します。
FROM SQL を指定する場合、function-designator に、次のような要件を満たす関数を指定しなければなりません。
  • タイプ type-name の 1 つのパラメーターがある
  • 戻りタイプは、組み込みタイプであるか、またはすべてが組み込みタイプの列を持つ行である
  • シグニチャーは、LANGUAGE SQL を指定しているか、 または LANGUAGE SQL を持つ別の FROM SQL トランスフォーム関数の使用を指定している
TO SQL を指定する場合、function-designator に、 次のような要件を満たす関数を指定しなければなりません。
  • すべてのパラメーターに組み込みタイプがある
  • 戻りタイプは type-name である
  • シグニチャーは、LANGUAGE SQL を指定しているか、 または LANGUAGE SQL を持つ別の TO SQL トランスフォーム関数の使用を指定している

function-designator に、 これらの要件 (FROM SQL トランスフォーム関数として使用する場合の要件、 または TO SQL トランスフォーム関数として使用する場合の要件) を満たさない関数を指定すると、 エラー (SQLSTATE 428DC) になります。

function-designator によって、メソッドをトランスフォームとして指定することはできません (FUNCTION ACCESS を使用して指定した場合でも)。 トランスフォームとして機能できるのは、CREATE FUNCTION ステートメントによって定義された関数のみです (SQLSTATE 42704 または 42883)。

詳しくは、 関数、メソッド、およびプロシージャーの指定子を参照してください。

ルール

  • FROM SQL 関数から戻された 1 つ以上の組み込みタイプが、 TO SQL 関数のパラメーターである 1 つ以上の組み込み関数と直接対応しているべきです。 これが、この 2 つの関数の相反する関係の論理的結末です。

  • 静的 SQL の場合は TRANSFORM GROUP プリコンパイル・オプションまたは BIND オプションを使って、 動的 SQL の場合は SET CURRENT DEFAULT TRANSFORM GROUP ステートメントを使って、 アプリケーション・プログラム内でトランスフォーム・グループを指定しない場合に、 そのアプリケーション・プログラムが、 type-name で指定されたユーザー定義の 構造化タイプに基づいているホスト変数を検索または送信しようとすると、 トランスフォーム・グループ 'DB2_PROGRAM' 内のトランスフォーム関数が使われます (定義されている場合)。 データ・タイプ type-name の値を検索すると、 FROM SQL トランスフォームが呼び出され、構造化タイプは、 トランスフォーム関数から戻された組み込みデータ・タイプにトランスフォームされます。 同様に、データ・タイプ type-name の値に割り当てられることになるホスト変数を送信すると、 TO SQL トランスフォームが呼び出され、 組み込みデータ・タイプ値は構造化タイプ値にトランスフォームされます。 ユーザー定義のトランスフォーム・グループを指定しない場合や、 'DB2_PROGRAM' グループ (特定の構造化タイプのもの) が定義されていない場合、 エラーが生じます (SQLSTATE 42741)。
  • 構造化タイプ・ホスト変数を表す組み込みデータ・タイプは、次のように割り当てる必要があります。
    • [割当元]プリコンパイル時に (検索割り当て規則を使用し) 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 トランスフォームが呼び出され、外部関数プログラムから戻された組み込みデータ・タイプ値は、 構造化タイプ値にトランスフォームされます。
  • 構造化タイプの中に、やはり構造化タイプである属性が入っている場合、 それに関連したトランスフォーム関数は、 すべてのネストされた構造化タイプを繰り返し展開 (またはアセンブル) する必要があります。 つまり、トランスフォーム関数の結果やパラメーターは、 サブジェクト構造化タイプ (ネストされたすべての構造化タイプも含む) のすべての基本属性を表す 一連の組み込みタイプだけで構成されることを意味します。 ネストされた構造化タイプを処理するために、 トランスフォーム関数が「カスケード化」されることはありません。
  • このステートメントに指定する関数は、 このステートメントの実行時に上記に概説した規則に従って解決されます。 これらの関数は、この後の SQL ステートメント内で (暗黙的に) 使用された場合、 これ以外の解決プロセスをたどりません。 このステートメントで定義されたトランスフォーム関数は、 このステートメントで解決されるとおりに記録されます。
  • 特定のタイプの属性またはサブタイプを作成またはドロップしたときは、 ユーザー定義構造化タイプのトランスフォーム関数も変更する必要があります。
  • ある特定のトランスフォーム・グループについて、FROM SQL トランスフォームと TO SQL トランスフォームを指定できるのは、 同じ group-name 節、別の group-name 節、 または別の CREATE TRANSFORM ステートメントのいずれかにおいてです。 既存のグループ定義をあらかじめドロップしておかないと、 FROM SQL トランスフォームまたは TO SQL トランスフォームの指定を再定義できないことが唯一の制約事項です。 それによって、例えば、特定のグループの FROM SQL トランスフォームを先に定義しておいてから、 後で同じグループ用の対応する TO SQL トランスフォームを定義することができます。

ユーザー定義の構造化タイプ・ポリゴンを、それぞれ 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)