使用XMLTABLE在DB2本机存储过程中解析XML

使用XMLTABLE在DB2本机存储过程中解析XML,xml,stored-procedures,db2,Xml,Stored Procedures,Db2,我是一个新的DB开发人员。 我必须创建一个接受XML作为输入的过程 解析它 证实 给出XML作为输出 我在解析XML时被卡住了。 我用过这张桌子。 下面是我的proc将使用的示例XML <root> <request>requestid1</request> <source>source1</source> <accountlist> <account>123456789</account>

我是一个新的DB开发人员。 我必须创建一个接受XML作为输入的过程

解析它 证实 给出XML作为输出 我在解析XML时被卡住了。 我用过这张桌子。 下面是我的proc将使用的示例XML

<root>
 <request>requestid1</request>
 <source>source1</source>
 <accountlist>
   <account>123456789</account>
   <account>234567890</account>
 </accountlist>
</root>

 CREATE PROCEDURE XMLPARSE ( 
 IN IN_REQ XML, 
 OUT OUT_REQ XML
 )

 DECLARE V_REQUEST CHAR(10) DEFAULT ' ';
 DECLARE V_SOURCE  CHAR(10) DEFAULT ' ';
 DECLARE V_ACCOUNT CHAR(09) DEFAULT ' ';

 DECLARE CURSOR1 CURSOR FOR

  SELECT X.* FROM
  XMLTABLE (‘$d/root/accountlist/account' PASSING IN_REQ as "d"
  COLUMNS
  "request" CHAR(10) PATH ‘../request’,
  "source"  CHAR(10) PATH '../source',
  "account" CHAR(9)  PATH '.') AS X;


  FETCH CURSOR1 INTO V_REQUEST, V_SOURCE, V_ACCOUNT;

  Rest of the logic to process the above obtained data

2如果上述方法不正确,请任何人建议正确的方法来解析DB2本机存储过程中的XML。

以下返回您想要的值

SELECT X.* 
FROM TABLE(VALUES
  XMLPARSE(document '<root>
 <request>requestid1</request>
 <source>source1</source>
 <accountlist>
   <account>123456789</account>
   <account>234567890</account>
 </accountlist>
</root>') )  AS IN(IN_REQ)
 , XMLTABLE ('$d/root/accountlist/account' PASSING IN_REQ as "d"
  COLUMNS
  "request" CHAR(10) PATH '../../request',
  "source"  CHAR(10) PATH '../../source',
  "account" CHAR(9)  PATH '.') AS X;
也就是说,您需要上两层到root,然后在XPath中获取这些列的请求和源

顺便说一句,您可能会发现不需要游标来执行后续逻辑,您可能可以在单个查询中完成所有工作

也可以考虑使用DB2特性来验证XML对XML模式的影响。


您使用的是DB2LUW还是z/OS?对程序的结果做了什么?结果会是什么样子?也许你不需要,用一张普通的桌子。您可以使用XML模式并使用它验证文档吗?account的父元素是accountlist,而不是root;调整您的路径规范。@data\u henrik,我在DB2 LUW上,无法使用普通表,我的过程必须使用XML,我必须从节点提取每个元素并将其作为输出。因此,在上面的示例中,我的输出应该返回request1、source1、1234567889和234567890作为输出参数。@mustaccio,我可以从上面的查询中获取这两个帐户,但我没有获取请求和源。除了XMLTABLE之外,还有其他命令可以从XML中提取元素吗?
SELECT X.* 
FROM TABLE(VALUES
  XMLPARSE(document '<root>
 <request>requestid1</request>
 <source>source1</source>
 <accountlist>
   <account>123456789</account>
   <account>234567890</account>
 </accountlist>
</root>') )  AS IN(IN_REQ)
 , XMLTABLE ('$d/root/accountlist/account' PASSING IN_REQ as "d"
  COLUMNS
  "request" CHAR(10) PATH '../../request',
  "source"  CHAR(10) PATH '../../source',
  "account" CHAR(9)  PATH '.') AS X;
 request        source      account
 ----------     ----------  ---------
 requestid1     source1     123456789
 requestid1     source1     234567890