スカラーUDFが有効な例の1つは、XML文書をデータベースに格納した後で、その文書をスキャンして指定された内容を返すというものです。次の外部UDFの例はXPathを使用します。XPathは、XML文書の中を移動するための構文ルールのセットです。サブストリングと類似した機能を持つXPathは、パス式を使ってXML文書内のノードを識別します。
要件によっては、XML文書をCLOB (文字ラージ オブジェクト)またはVARCHAR列として格納することも可能です。以下の図は前者を示しており、以下のプロトタイプは後者を使用しています。
この例では、XML文書がTeradata Database内にXMLOrderという1つのVARCHAR列として格納されます。実テーブルOrderLogには、PONum列とこのVARCHAR列の2つの列だけが含まれています。XML文書をいかに示します。
<?xml version="1.0"?> <ROOT> <ORDER> <DATE>8/22/2004</DATE> <PO_NUMBER>101</PO_NUMBER> <BILLTO>Mike</BILLTO> <ITEMS> <ITEM> <PARTNUM>101</PARTNUM> <DESC>Partners Conference Ticket</DESC> <USPRICE>1200.00</USPRICE> </ITEM> <ITEM> <PARTNUM>147</PARTNUM> <DESC>V2R5.1 UDF Programming</DESC> <USPRICE>28.95</USPRICE> </ITEM> </ITEMS> </ORDER> </ROOT>
orderlogテーブルのDDLは次のようになります。
CREATE SET TABLE orderlog, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT ( PONum INTEGER NOT NULL, XMLOrder VARCHAR(63,000) ) UNIQUE PRIMARY INDEX ( PONum );
次のSELECTリクエストではXpathValueUDFを参照しています。このUDFは、XPathを使ってXML文書から要素と属性の内容を抽出します。次いでXPathは、SELECTリクエストの中で渡される引数(例えばBILLTO名)を使用して表内の各文書を検索します。特定の請求先名を持つ文書が識別されると、出力引数として関連PO番号と日付が返されます。
SELECT XPathValue(O.xmlOrder, '//ORDER/PO_NUMBER/*') AS PO_Number, XPathValue(O.xmlOrder, '//ORDER/DATE/*') AS theDate FROM OrderLog O WHERE XPathValue(O.xmlOrder,'//ORDER/BILLTO/*') = 'Mike';
XPathValue UDFを使用する問合わせの出力は次のようになります。
PO_Number TheDate ----------- ---------------- 101 8/22/2004