在db2中从xml中提取节点

在db2中从xml中提取节点,db2,extract,Db2,Extract,我正在努力从具有多个节点的xml中提取节点 这是xml <DataArea> <TB001I> <IOCOD>aaa</IOCOD> <IODESC>desc</IODESC> </TB001I> <TB001I> <IOCOD>bbb</IOCOD> <IODESC>desc</IODESC> </TB001I> <TB001I>

我正在努力从具有多个节点的xml中提取节点 这是xml

<DataArea>
<TB001I>
<IOCOD>aaa</IOCOD>
<IODESC>desc</IODESC>
</TB001I>
<TB001I>
<IOCOD>bbb</IOCOD>
<IODESC>desc</IODESC>
</TB001I>
<TB001I>
<IOCOD>ccc</IOCOD>
<IODESC>desc</IODESC>
</TB001I>
</DataArea>
运行SP时,P2和P4正常,但P3不返回任何内容 我将在xml中为TB001I类型的任何标记或循环创建一个节点,并返回IOCOD和IODESC的任何值

你能帮忙吗?
谢谢

xmlquery是错误的,但正确的$d/DataArea/TB001I[i]/IOCOD也不起作用您发布的代码有很多错误。XML中的元素名称是
IOCOD
IODESC
,但XQuery引用的是
cdcode
ccdesc
。变量
p5
未在存储过程中的任何位置声明。既然您说您能够运行该过程并获得部分正确的结果,请编辑您的问题,使其包含的代码有效。除其他问题外,您的过程目前编写为迭代,直到
i
等于5,每次都用
//TB001[i]/ccdesc
中的任何内容覆盖
p3
,即使文档中该位置不存在任何内容。将五次迭代硬编码到循环中(不管
inpdoc
输入文档的大小)意味着在循环结束时,只要输入文档包含少于五个
//TB001
元素,
p3
将始终为空。
CREATE OR REPLACE PROCEDURE TESTSQL 
( 
  IN  inpdoc  XML, 
  OUT p2      VARCHAR(30), 
  OUT p3      VARCHAR(30) 
) 
LANGUAGE SQL 
NO EXTERNAL ACTION 
BEGIN 
declare i int; 
declare z int; 
declare p4 varchar(30); 
set i = 0; 
set z = 1; 
while (z = 1) do 
   set i = i + 1; 
  SET p2 = 
        XMLCAST 
        ( 
          XMLQUERY('$d/DataArea/TB001[1]/cdcod' PASSING inpdoc AS "d") 
          AS VARCHAR(30) 
        ); 

  SET p3 =XMLCAST 
    ( XMLQUERY('$d/DataArea/TB001[i]/ccdesc' PASSING inpdoc AS "d") 
       AS VARCHAR(30) 
    ); 
  SET p4 = 
    XMLCAST 
    ( 
      XMLQUERY('$d/DataArea/TB001[last()]/cdcod' PASSING inpdoc AS "d") 
      AS VARCHAR(30) 
    ); 
 SET p5 = 

      XMLQUERY('for $b in$d/DataArea/TB001 return $b/cdcod' PASSING inpdoc        AS "d"); 
   if i = 5 then 
       set z = 0; 
   end if; 
end while; 

END