MEMO-PL/SQL SELECT XML Nodes FROM XmlType
6 |
今天跟同事商討整合規格時,遇到一個議題: 如果將多筆資料轉成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
測試成功!
Comments
# by James
請問您是用什麼方法將XML文件的內容導入xt變數中呢?
# by James
請問您是用什麼方式將XML文件內容導入XT參數呢?
# by Jeffrey
to James, XmlType('....')的寫法可以將(N)VarChar2型別轉成XmlType,因此在Procedure中可以用Parameter接入VarChar2或是直接由Table中SELECT VarChar2欄位,當成XmlType()的參數,就可以得到Xml資料型別了。
# by James
您的意思是假設已經有一個Table的欄位型態為VarChar2,欄位裡的資料已經是XML類似的文字。 例如: <root><item>Item1</item><item>Item2</item><item>Item3</item></root> 而我原先的想法是,以上這段文字還存在*.XML的文件中,我以為有什麼方法可以將*.XML文件"直接"拿來灌入Procedure之中。 如果無法直接將XML文件當Procedure的參數的話,您又是用什麼方式將XML文件內容灌入資料表的VarChar2欄位呢?
# by Jeffrey
to James, 我們的應用情境中,XML由.NET程式產生後直接寫入資料庫VARCHAR欄位,後續其他.NET程式則是讀出修改後再寫回去,過程中沒有轉存到檔案。會引發這個議題是有個Procedure想將XML中的多筆資料拿來JOIN使用,原本的解決方案是另建一個Table,在.NET中讀出XML的Node再變成一筆筆資料INSERT進另建的Table。由於不想為了這個小需求多生一個Table出來,才想到直接把XML字串轉成Table這一招。如果要將XML資料灌入Varchar2,我應該會用File.ReadAllText讀出字串,再用OracleCommand, OracleParameter的方式把它當成一般字串寫入。希望有解答你的疑惑。
# by James
了解,我本以為只用Oracle有方法可以讀XML檔案,原來不是這樣,還要寫一些程式輔助,謝謝了。