我是DB2和存储过程的新手。我想在DB2中编写一个存储过程来更新表。该过程具有XML文档作为其输入参数。
我需要循环遍历XML的每个记录,选择一些节点并更新表中的相应行。此存储过程将用于批量更新表。
我有程序的伪代码,但不确定它在DB2中的外观。
INPUT XML属于FORMAT
<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
请帮我创建上述程序。我无法在DB2中获得ForEach,XML节点处理,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 :(得分:0)
DB2对XML数据提供了很好的支持,因此您可以选择如何粉碎XML并将其应用于一个或多个表。
您正在寻找的功能是XMLTABLE。到目前为止,它是将XML分解为单个表格结果集的最灵活方式。
当您的传入XML文档包含需要转到多个表的数据时,DECOMPOSE XML DOCUMENT语句功能强大,但它需要预先注册的XML架构文档,其中包含指定每个XML节点映射的特殊注释。它的关系目标。此语句不允许declared global temporary table(DGTT)作为目标表,当传入的XML数据需要在暂存DGTT中进行额外处理才能将其写入其最终目标之前,这是一个问题。 / p>
对于应用碎片数据的基于游标的方法,可以使用单个MERGE语句替换整个循环,该语句使用输入表达式的XMLTABLE结果集。有许多使用DB2的MERGE语句进行“upsert”处理的在线示例,其中每个传入行可能需要INSERT或UPDATE,具体取决于目标表中是否存在该主键。