使用XMLTABLE在DB2本机存储过程中解析XML
我是一个新的DB开发人员。 我必须创建一个接受XML作为输入的过程 解析它 证实 给出XML作为输出 我在解析XML时被卡住了。 我用过这张桌子。 下面是我的proc将使用的示例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>
<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