2010-02-28 69 views
2

簡化,我產生一組XML元素的一個SQL查詢,如:輸出一個DB2 SQL XML查詢到一個獨特的XML文件

SELECT XMLELEMENT(NAME "project", project) FROM project; 
<project>project1</project> 
<project>project2</project> 
... 

現在我需要這個序列包裝成一個主要的「項目」元素,並將其輸出爲一個很好的縮進XML文件。

我已經試過如下:

db2 -x "SELECT XMLSERIALIZE(CONTENT XMLELEMENT(NAME "projects", XMLAGG(XMLELEMENT(NAME "project", project))) AS CLOB INCLUDING XMLDECLARATION) FROM project" >output.xml 

而我得到的東西,如:

<projects><project>project1</project><project>project2</project>...</projects> 

的XMLAGG作品(它已結束一切都變成一個主要項目元素)。但是,對於10萬個項目,db2抱怨「SQL0433N值」太長。 SQLSTATE = 22001"

而且,與Output.xml沒有縮進(一切都在一行中)。

什麼是實現這一目標的正確方法是什麼?

問候, 大衛

+1

http://amolnpujari.wordpress.com/2008/04/12/db2-native-xml/可能有助於 – 2014-03-20 11:22:55

回答

1

外貌就像你需要創建一個臨時表,並將開始和結束標記手動放在那裏以及查詢結果一樣(一定要添加一些空格用於縮減查詢結果)如果你有一個ID列,一切都按照正確的順序排列在表格中,那麼你只需要查詢表格(不用ID,但是有序通過id)並將結果保存到文件中。

或者,你有一個存儲過程去了查詢和輸出它的格式化方式的結果。這可能比第一種解決方案慢,但需要的內存可能更少。

最後選項你用你的原始查詢和提交過程的結果,與外部工具。

+0

感謝。是的,可以選擇編寫一個簡單的外部工具,它只接受一個xml列的選擇查詢,並將其寫入一個包裝的xml文件中,這似乎是一個不錯的選擇。 – 2010-03-15 12:56:51

1

你可能不會得到你想要的精確縮進,但你至少可以得到每行一個保證換行符,如果你不將整個文檔XMLAGG成一個單一的巨大CLOB。

公共表表達式是指定不必出現在最終的選擇語句排序列的一個方便的方法。

WITH xmlheader(xmlrow, sort_seq) AS (VALUES ( 
' <?xml version="1.0" ?>'|| CHR(10) || '<projects>', 1)) 
, 
xmlbody(xmlrow, sort_seq) AS (VALUES( 
'<project>Replace this with your XMLSERIALIZE query, ' 
|| 'but only focus on generating XML for one project per row. ' 
|| 'This will enable you to specify a narrower data type, such AS VARCHAR(1000) ' 
|| 'for each row, and you will get each separate project ' 
|| 'followed by the normal newline at the end of each SQL row. ' 
|| 'No XMLAGG is necessary in this query.</project>', 2)) 
, 
xmlfooter(xmlrow, sort_seq) AS (VALUES('</projects>', 3)) 

SELECT xmlrow FROM (
    SELECT xmlrow, sort_seq FROM xmlheader 
    UNION ALL 
    SELECT xmlrow, sort_seq FROM xmlbody 
    UNION ALL 
    SELECT xmlrow, sort_seq FROM xmlfooter 
) AS fullxml 
ORDER BY sort_seq 
+0

謝謝,它的作品!然而它似乎有點人爲的解決方案。 我希望這個任務能夠普及到擁有一個優雅簡單的解決方案。 – 2010-03-15 12:57:07

+0

我同意這有點人爲和​​駭人聽聞,但它是爲了避免CLOB數據類型,所以它可以在任何地方使用,包括使用DB2 CLP的shell腳本。無論如何,你不應該需要多個語句或臨時表。 還有其他選項取決於您的限制條件。 XMLAGG將整齊地摺疊所有的子元素分解成一排,但你必須序列化文檔作爲CLOB,這限制了你的選擇來處理它: 1.出口與LOB選項, 或 2。從程序發送XMLAGG查詢,而不是處理結果集中的LOB列。 – 2010-03-24 19:21:12