我是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
什麼是您的db2版本? – 2012-04-21 16:59:13
我正在使用DB2 Express-C 9.7.5 – techknowfreak 2012-04-22 04:11:33
感謝您展示適合您的答案。 – 2012-04-23 21:26:23