例: 一時SQL式を含むXSLT_SHRED_BATCH - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - XMLデータ型

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/kxe1590704060061.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1140
Product Category
Software
Teradata Vantage

次の例では、一時列での<xsl:value-of select="">マッピング定義の使用方法を示します。一時列の値を使用して、ターゲット テーブルの列の値を計算します。高度にカスタマイズされた計算が必要な場合のユーザー定義関数など、任意の有効なSQL式を使用してこの計算を実行できます。関連付けられているデータ項目自体は、ターゲット テーブルに挿入されません。

次の構文は、C_Name列の計算で使用されているC_Name_Transient列を示しています。

すべての一時列には、有効なSQLデータ型を持つsqltype属性が必要です。これは、この列がターゲット テーブルに存在しないためです。
<Row>
      <C_Id><xsl:value-of select="/Id " /></C_Id> 
      <C_Name_Transient sqltype=”varchar(30)” transient=”true”>
                 <xsl:value-of select=" …../NameTransent " />
      </ C_Name_Transient >
      < C_Name sqlexpr=”true”><![CDATA[‘HYD_’ || C_Name_Transient]]> 
      < C_Name >
           .
           .
           .
 </Row>

この例を実行する前に、必要な権限を持つテスト ユーザーが作成され、必要なテーブルが作成されていることを確認します。参照整合性ルールについては、XSLT_SHRED_BATCHとXSLT_SHREDの例の設定を参照してください。

XMLソース文書を格納するために使用するステージング テーブルにデータを挿入します。

INSERT INTO TransientTbl_Docs values(1, CREATEXML('<?xml version="1.0"?> 
<Customers>
 <Customer>  
  <C_Id>100</C_Id> 
  <C_Name>EMP_ABCD</C_Name>
  <C_Sal_Transient>1200</C_Sal_Transient>
</Customer>
<Customer> 
  <C_Id>200</C_Id>
  <C_Name>EMP_XYZ</C_Name>
  <C_Sal_Transient>1300</C_Sal_Transient>
</Customer>
</Customers>'));

スタイルシート マッピングによってXSLT_SHRED_BATCHストアド プロシージャを呼び出し、ステージング入力テーブルに格納されるXMLデータをシュレッドします。次の引数を呼び出しに使用します。

  • queryStringは、次のようになります: SEL * FROM xsltuser.TransientTbl_Docs.
  • xsltMapping引数は、スタイルシートを入力とするCREATEXML関数を呼び出すことで指定します。このスタイルシートは、XML文書に適用されます。
  • この例では、externalContextはNULLです。
  • resultCode:res.で返されます。操作が成功すると0が返されます。
CALL TD_SYSXML.XSLT_SHRED_BATCH('sel * from xsltuser.TransientTbl_Docs', 
CREATEXML('<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/Customers">
 <Transaction>
  <Insert>
   <Table>
    <xsltuser.TransientTbl>
     <xsl:for-each select="Customer">
      <Row>
       <xsl:copy-of select="C_Id"/>
       <xsl:copy-of select="C_Name"/>
       <C_Sal_Transient sqltype="Int" transient="true">
         <xsl:value-of select="C_Sal_Transient" />
       </C_Sal_Transient>
       <C_Sal sqlexpr="true">100 * C_Sal_Transient</C_Sal>
      </Row>
     </xsl:for-each>
    </xsltuser.TransientTbl>
   </Table>
  </Insert>
 </Transaction>
</xsl:template>
</xsl:stylesheet>'), NULL, :res);

結果: ターゲット テーブルで更新されたデータを表示するには次を実行します。SEL * FROM TransientTbl;

  C_Id  C_Name             C_Sal
------  ------------ -----------
   200  EMP_XYZ           130000
   100  EMP_ABCD          120000