17.10 - UDTデータ変換の機能 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)

CREATE TRANSFORM文はデータ変換グループをUDTに関連付けます。PERIODまたは地理空間データ型の場合は、データ変換グループを作成する必要はありません。

開発するUDTごとに1つのデータ変換グループがなければなりません。新しいDISTINCT型UDTをデフォルトで作成すると、データ変換グループはシステムによって定義されますが、すべての新規STRUCTURED型UDTに対してはデータ変換グループを明示的に定義する必要があります。

UDTには任意のテーブルの列タイプとして使用するために完全に定義されたデータ変換機能が必要です。この機能がないと、UDT型の列を含むテーブルを作成したり、そのようにテーブルを変更しようとしたときにアボートし、システムはリクエスト側にエラーを返します。

UDTのデータ変換グループは以下のマッピングを実行します。
  • 特定のデータベースUDTから、特定の事前定義されたクライアント データ型のサーバー形式へのマッピング。

    このデータ変換を実行するルーチンを、fromsql変換ルーチンといいます。

  • 事前定義されたクライアント データ型から、データベースの特定のUDTへのマッピング。

    このデータ変換を実行するルーチンを、tosqlデータ変換ルーチンといいます。

このようなデータ変換マッピングの対をデータ変換グループと呼びます。1つのデータ変換グループが1組のtosql/fromsqlを定義します。1つのUDTが持つことのできるデータ変換グループは1つだけです。

有効なCREATE TRANSFORMリクエストを実行して、tosqlルーチンのみまたはfromsqlルーチンのみをUDTに関連付けることはできますが、UDTをテーブルの列データ型として指定する前に、UDTの完全なデータ変換機能を定義しておく必要があります。そうしないと、システムはALTER TABLEまたはCREATE TABLEリクエストをアボートし、リクエスト側にエラーを返します。

UDTの種類 データ変換グループの機能
1次元および多次元ARRAYおよびVARRAY データベースによって自動生成されます。

VARCHAR列内の変換された出力の形式は、各配列要素値列(変換値列と呼ばれる)であり、以下に示されているようにカンマおよび括弧で区切られます。この配列にn個の構成要素が含まれている場合、形式は以下のようになります。

(<element_1>,<element_2>, … <element_n>)

次のルールが適用されます。

  • BLOB、CLOB、および地理空間の要素タイプはサポートされていません。
  • 要素タイプがCHARACTER、VARCHAR、またはCHARACTERあるいはVARCHAR属性を含むUDTではない場合、配列コンストラクタ/変換値列の定義は、VARCHAR(64000) CHARACTER SET LATINです。

    配列タイプの作成中に変換値列のサイズが64kより大きくなった場合、リクエストはアボートし、データベースはリクエスト側にエラーを返します。

  • 要素タイプがCHARACTER、VARCHAR、またはCHARACTERあるいはVARCHAR属性を含むUDTである場合、配列変換値列の定義は、その要素タイプと同じ文字セットのVARCHAR(max)です。

    VARCHARの場合、maxは、現在の文字セット内のVARCHARのサイズに有効な最大の数値を指定します。

    Latin文字セットの場合、これは64 KBです。

    ARRAYタイプの作成中に変換値列のサイズがmaxの値より大きくなった場合、リクエストはアボートし、データベースはリクエスト側にエラーを返します。

  • システムは、初期化されていない要素を報告しません。要素値が初期化されている場合、その前にあるすべての要素もnullまたは特定の値に初期化されます。
  • オーバーフロー回避。

    配列変換値列のサイズは、VARCHARデータ型、CHARACTERデータ型、およびCLOBデータ型(特にVARCHARデータ型)のサイズ制限内でなければなりません。

    ARRAY型の作成中に、変換値列のサイズがVARCHAR変数のサイズ制限より大きくなった場合、データベースはリクエストをアボートし、リクエスト側にエラーを返します。

  • null要素はNULLリテラルによって示される必要があります。サーバーの文字セットがLatin以外の場合、null要素は、サーバーの文字セットのNULLリテラルの対応するエンコーディングによって示されます。同じことが、nullのSTRUCTURED型UDT値またはnull属性を含むSTRUCTURED型UDTにも当てはまります。
 
  • データベースは、カンマの前または後に置かれているかにかかわらず、パッド文字、改行文字、またはタブ文字をすべて無視します。同じことは、このような文字が最後の単一引用符文字の前に置かれている場合、または最初の単一引用符文字の後に置かれている場合にも当てはまります。

    要素タイプがCHARACTER、VARCHAR、またはCHARACTERあるいはVARCHAR属性を含むUDTであり、ARRAY/VARRAY要素に多数の組み込み単一引用符文字が含まれている場合、組み込み単一引用符文字を区別するためにもう1つ単一引用符文字が必要になります。これにより、ARRAY/VARRAY列を選択したときに、出力できる変換列の合計サイズが制限されます。これは、組み込み単一引用符文字がカウントされるためです。

    ARRAY/VARRAY要素に組み込み単一引用符文字が含まれているなら、データ変換ONモードでfromsqlデータ変換を使用してARRAY/VARRAY列が選択された場合に、それらの単一引用符文字も出力されます。

    最悪の場合、1つの列にすべての単一引用符文字が組み込まれ、最大データ変換列は半分に削減されます。このため、ARRAY/VARRAY型用に生成されるはずのデータ変換列の合計サイズが、最大行サイズを超える場合、そのARRAY/VARRAY型に対するCREATE TYPEリクエストはアボートし、データベースはリクエスト側にエラーを返します。

DISTINCT データベースによって自動的に生成されます。

システム生成のデータ変換グループのセマンティクスが適切であれば、CREATE TRANSFORM文を使用して明示的なtosqlおよびfromsqlデータ変換機能を定義する必要はありません。

使用するアプリケーションに、それとは異なるより充実したデータ変換セマンティクスが必要な場合は、CREATE TRANSFORMを使用して、明示的なデータ変換グループ機能を指定することができます。

STRUCTURED CREATE TRANSFORM文を使用して明示的に定義する必要があります。

データベースとの間でUDTがインポートまたはエクスポートされるときに、システムは必ずデータ変換機能を暗黙的に呼び出します。

システムは、外部ルーチンのUDTパラメータ セットにデータ変換グループを指定することは許可しません。その代わりに、プロセスが外部ルーチンを呼び出すと、システムはUDT値を直接外部ルーチン引数に渡すのではなく、UDTハンドルを渡します。外部ルーチンはこのUDTハンドルを使用し、Teradataが提供する一連のライブラリ関数でUDT引数の値を取得または設定します。詳細については、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照してください。

UDTのデータ変換グループ ルーチンに指定される事前定義タイプを、UDTの外部タイプといいます。外部タイプは常にTeradataサーバー形式です。つまり、UDT固有のtosql操作とfromsql操作に続けて、通常のクライアント形式からデータベース形式へのデータ変換も実行されます。

tosql操作の場合、これは以下のアクションが指定された順序で発生することを意味します。

  1. システムは、UDTの外部タイプをクライアント形式からデータベース形式にデータ変換します。
  2. システムはtosqlルーチンを実行します。

fromsql操作の場合、これは以下のアクションが指定された順序で行われることを意味します。

  1. システムはfromsqlルーチンを実行して、UDTを外部タイプのデータベース形式にデータ変換します。
  2. システムは、外部タイプをデータベース形式からクライアント形式にデータ変換します。