MEMO-PL/SQL SELECT XML Nodes FROM XmlType

今天跟同事商討整合規格時,遇到一個議題: 如果將多筆資料轉成XML Element,以XML String方式寫入ORACLE欄位,在Stored Procedure裡可否比照Table,用SELECT的方式將多筆資料查詢出來呢?

剛好前幾天另一位同事提到Oracle 9+支援XmlType,現學現賣,再參考網路上的資料,我寫了以下的範例:

DECLARE
  xt XmlType;
  TYPE refCur IS REF CURSOR;
  rc refCur;
  t VARCHAR2(1024);
  i NUMBER;
BEGIN
    xt := XmlType(
'<root><item>Item1</item><item>Item2</item><item>Item3</item></root>');
    
    OPEN rc FOR
      SELECT extractValue(value(x), '//item/text()') as ItemText
      FROM TABLE(XmlSequence(EXTRACT(xt, '//item'))) X;
 
    i := 0;
    
    LOOP
      FETCH rc INTO t;
      EXIT WHEN rc%NOTFOUND; 
      i := i + 1;
      dbms_output.put_line(i || '->' || t);
    
    END LOOP;
END;

執行結果為:

1->Item1
2->Item2
3->Item3

測試成功!

Published 08 October 2009 08:30 AM 由 Jeffrey
Filed under:


意見

# James said on 08 October, 2009 02:13 AM

請問您是用什麼方法將XML文件的內容導入xt變數中呢?

# James said on 08 October, 2009 02:14 AM

請問您是用什麼方式將XML文件內容導入XT參數呢?

# Jeffrey said on 08 October, 2009 03:46 AM

to James, XmlType('....')的寫法可以將(N)VarChar2型別轉成XmlType,因此在Procedure中可以用Parameter接入VarChar2或是直接由Table中SELECT VarChar2欄位,當成XmlType()的參數,就可以得到Xml資料型別了。

# James said on 10 October, 2009 12:25 AM

您的意思是假設已經有一個Table的欄位型態為VarChar2,欄位裡的資料已經是XML類似的文字。

例如:

<root><item>Item1</item><item>Item2</item><item>Item3</item></root>

而我原先的想法是,以上這段文字還存在*.XML的文件中,我以為有什麼方法可以將*.XML文件"直接"拿來灌入Procedure之中。

如果無法直接將XML文件當Procedure的參數的話,您又是用什麼方式將XML文件內容灌入資料表的VarChar2欄位呢?

# Jeffrey said on 10 October, 2009 02:52 AM

to James, 我們的應用情境中,XML由.NET程式產生後直接寫入資料庫VARCHAR欄位,後續其他.NET程式則是讀出修改後再寫回去,過程中沒有轉存到檔案。會引發這個議題是有個Procedure想將XML中的多筆資料拿來JOIN使用,原本的解決方案是另建一個Table,在.NET中讀出XML的Node再變成一筆筆資料INSERT進另建的Table。由於不想為了這個小需求多生一個Table出來,才想到直接把XML字串轉成Table這一招。如果要將XML資料灌入Varchar2,我應該會用File.ReadAllText讀出字串,再用OracleCommand, OracleParameter的方式把它當成一般字串寫入。希望有解答你的疑惑。

# James said on 11 October, 2009 05:56 AM

了解,我本以為只用Oracle有方法可以讀XML檔案,原來不是這樣,還要寫一些程式輔助,謝謝了。

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

請輸入以上的數字:

搜尋

Go

<October 2009>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
【工商服務】

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication