2012-04-21 32 views
1

我是DB2和存儲過程的新手。我想在DB2中編寫一個存儲過程來更新表。該過程具有一個XML文檔作爲其輸入參數。DB2 UPDATE通過INPUT XML存儲過程循環

我需要遍歷XML的每個記錄,選擇一些節點並更新表中的相應行。此存儲過程將用於批量更新表。

我有過程的僞代碼,但不知道它將如何在DB2中看起來。

輸入XML的格式爲

<Root> 
    <Record> 
    <a>1234</a> 
    <b>1</b> 
    <c>2</c> 
    <d>A</d> 
    <e>B</e> 
    <f>C</f> 
    </Record> 
<Record> 
    <a>1235</a> 
    <b>1</b> 
    <c>2</c> 
    <d>A</d> 
    <e>B</e> 
    <f>C</f> 
    </Record> 
</Root> 

的過程將類似於

CREATE PROCEDURE UPDATE_BATCH (IN INDOC XML) 
P1: BEGIN 

FOR rec AS rec CURSOR FOR(
SELECT 
Record.XMLQUERY('//Record/a/text()') AS A, 
Record.XMLQUERY('//Record/b/text()') AS B, 
Record.XMLQUERY('//Record/c/text()') AS C, 
Record.XMLQUERY('//Record/d/text()') AS D, 
Record.XMLQUERY('//Record/e/text()') AS E, 
Record.XMLQUERY('//Record/f/text()') AS F 
FROM 
TABLE (INDOC)Record--Not Sure how to construct table from input xml 
) 
DO 
UPDATE XYZ.TEMP_TABLE 
SET ACOL=Record.A, 
BCOL=Record.B, 
CCOL=Record.C, 
DCOL=Record.D, 
ECOL=Record.E 
WHERE 
FCOL=Record.F; 
END FOR; 
END P1 

請幫我創建上面的過程。我無法獲得正確的ForEach語法,XML節點處理,DB2中的CURSOR和LOOPING。

ANSWER

CREATE PROCEDURE UPDATE_BATCH(IN DOC XML) 
BEGIN 
MERGE INTO XYZ.TEMP_TABLE AS T 
USING (SELECT X.* FROM 
XMLTABLE('$d/Root/Record' passing DOC as "d" 
COLUMNS 
     "A" VARCHAR(10) PATH 'a', 
     "B" VARCHAR(10) PATH 'b', 
     "C" VARCHAR(10) PATH 'c', 
     "D" VARCHAR(10) PATH 'd', 
     "E" VARCHAR(10) PATH 'e', 
     "F" VARCHAR(10) PATH 'f' 
) AS X) AS XT 
ON T.FCOL=XT."F" 
WHEN MATCHED THEN 
UPDATE 
SET 
T.ACOL=XT."A", 
T.BCOL=XT."B", 
T.COL=XT."C" 
END 
+0

什麼是您的db2版本? – 2012-04-21 16:59:13

+0

我正在使用DB2 Express-C 9.7.5 – techknowfreak 2012-04-22 04:11:33

+0

感謝您展示適合您的答案。 – 2012-04-23 21:26:23

回答

0

DB2對XML數據的支持體面,所以你必須對如何將XML分解,並將其應用到一個或多個表的幾個選項。

您正在尋找的功能是XMLTABLE。它是迄今爲止將XML分解成單個表格結果集的最靈活的方法。

當傳入的XML文檔包含需要轉到多個表的數據時,DECOMPOSE XML DOCUMENT語句功能強大,但它需要一個預註冊的XML模式文檔,其中包含特殊的註釋,用於指定每個XML節點到其關係目標的映射。此聲明不允許declared global temporary table(DGTT)充當目標表,當傳入的XML數據需要在暫存DGTT中進行額外處理之後才能將其寫入其最終目標,這一直是個問題。

至於基於光標的應用碎化數據的方法,您可以用一個使用XMLTABLE結果集作爲輸入表達式的單個MERGE語句替換整個循環。有很多關於使用DB2的MERGE語句處理「upsert」處理的示例,其中每個傳入行都可能需要INSERT或UPDATE,具體取決於目標表中是否存在該主鍵。

+0

非常感謝!按照您的寶貴建議,我可以開展工作。 – techknowfreak 2012-04-23 15:31:46

+0

要更新100個這樣的xml記錄,sp大約需要1.5分鐘。我認爲這太長了..可能是什麼原因?.. – techknowfreak 2012-04-23 15:58:14

+0

確保目標表正確編制了正在執行的更新,並且表具有準確的統計信息(通過RUNSTATS)。 DB2有一個解釋實用程序,顯示優化程序爲查詢選擇的訪問計劃。在merge語句本身上使用explain實用程序比在整個存儲過程上使用explain應用程序可能更容易。您通過explain實用程序運行的語句將受益於包含查詢有效數據的硬編碼XML文檔。 – 2012-04-23 21:27:57