column要素はtable要素の子です。各column要素には以下の構成要素があります。
- テーブルの列名を識別するname属性
- 列のデータ型を記述するオプションのsqltype子要素
- 列の値を生成するSQL式を指定するオプションのsqlexpr子要素。 Sqlexprは、抽出された値がシュレッディングされる前に変更する場合に必要です。 例:
<column name="Sal"><sqlexpr>case when Grade=10 then Sal_Temp*2 else Sal_Temp*3 END</sqlexpr></column>
次のセクションで詳細な例を参照してください。
- transientという名前のオプション属性などの追加属性。これがtrueの場合、関連する値がターゲット テーブルの列の計算に使用されることを示します(つまり、このデータ項目自体がターゲット テーブルに挿入されるのではありません)。抽出された値をsqlexprで使用するときはtransient が必要です。transient列にはsqltypeが必須になります。これはその列がターゲット テーブルに存在しないためです。 例:
<column name="Sal_Temp" transient="true" ref="_Sal_item_" path="Employee/Sal"><sqltype name="Integer"/></column>
次のセクションで詳細な例を参照してください。
td:item属性はスキーマの要素宣言または属性宣言に出現します。検証XMLパーサーはこの属性を無視します。これはマッピングを表わす注釈を無視するのと同じです。
td:item属性は、XML文書中に出現する各要素または属性に固有識別子を与えるために使用されます。この固有識別子は、XML文書をターゲット テーブルにシュレッドする際に列の値のソースになる要素または属性を識別するため、column要素のref属性で使用します。column要素のすべてのref属性は、スキーマ内のどこかで定義されたtd:item属性と一致しなければなりません。
例: Column要素内でのsqlexprおよびtransientの使用
CREATE TABLE TRANSIENT_SQLEXPR_DOC(Id INTEGER, Xmldoc XML);
INSERT INTO TRANSIENT_SQLEXPR_DOC VALUES(1, CREATEXML('
<Employees>
<Employee>
<Id>1000</Id>
<Name>TIES</Name>
<Grade>10</Grade>
<Sal>40000</Sal>
</Employee>
<Employee>
<Id>1001</Id>
<Name>TIES</Name>
<Grade>11</Grade>
<Sal>60000</Sal>
</Employee>
</Employees>'));
CREATE TABLE EMP(Id Integer, Name VARCHAR(100), Grade Integer, Sal Decimal(18,4));
CALL TD_SYSXML.AS_SHRED_BATCH(
'sel id, xmldoc from TRANSIENT_SQLEXPR_DOC',
CREATEXML('<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:td="http://www.teradata.com/xml">
<xs:annotation>
<xs:appinfo>
<context xmlFeatureVersion="13.00.00.00" xmlns="http://www.teradata.com/xml">
<defaultDatabase>dr178882</defaultDatabase>
<defaultEncoding>ISO-8859-1</defaultEncoding>
<rootElement ref="_Employee_item_"/>
<transaction>
<operation type="insert">
<table name="EMP">
<column name="Id" ref="_Id_item_" path="Employee/Id"/>
<column name="Name" ref="_Name_item_" path="Employee/Name"/>
<column name="Grade" ref="_Grade_item_" path="Employee/Grade"/>
<column name="Sal_Temp" transient="true" ref="_Sal_item_" path="Employee/Sal"><sqltype name="Integer"/></column>
<column name="Sal"><sqlexpr>case when Grade=10 then Sal_Temp*2 else Sal_Temp*3 END</sqlexpr></column>
</table>
</operation>
</transaction>
</context>
</xs:appinfo>
</xs:annotation>
<xs:element name="Employees">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="Employee"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Employee" td:item="_Employee_item_">
<xs:complexType>
<xs:sequence>
<xs:element name="Id" td:item="_Id_item_" type="xs:int"/>
<xs:element name="Name" td:item="_Name_item_" type="xs:string"/>
<xs:element name="Grade" td:item="_Grade_item_" type="xs:int"/>
<xs:element name="Sal" td:item="_Sal_item_" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'), '', :res);
SEL * FROM EMP;
クエリー結果:
Id Name Grade Sal
---------- ---------------------- ----------- --------------------
1000 TIES 10 80000.0000
1001 TIES 11 180000.0000