我的任务是在MySQL存储过程中解析一个简单的XML格式的字符串.XML看起来像这样(仅用于测试目的):
<parent>
<child>Example 1</child>
<child>Example 2</child>
</parent>
Run Code Online (Sandbox Code Playgroud)
我需要MySQL做的是每个匹配产生一行结果集.我存储的proc代码如下所示:
DECLARE xmlDoc TEXT;
SET xmlDoc = '<parent><child>Example 1</child><child>Example 2</child></parent>';
SELECT ExtractValue(xmlDoc, '//child');
Run Code Online (Sandbox Code Playgroud)
然而,这样做是连接所有匹配,产生"示例1示例2".顺便说一下,这是有记录的,但却毫无用处的行为.
我该怎么做才能让它在行中返回匹配而不必计算匹配并逐个处理它们?甚至可以使用MySQL吗?
谢谢大家!
这需要一个行集生成功能,并且MySQL
缺少它.
您可以使用虚拟表或子查询:
SELECT ExtractValue(@xml, '//mychild[$@r]'),
@r := @r + 1
FROM (
SELECT @r := 1
UNION ALL
SELECT 1
) vars
Run Code Online (Sandbox Code Playgroud)
请注意,对会话变量的支持XPath
被打破5.2
(但工作正常5.1
)
DECLARE i INT DEFAULT 1;
DECLARE count DEFAULT ExtractValue(xml, 'count(//child)');
WHILE i <= count DO
SELECT ExtractValue(xml, '//child[$i]');
SET i = i+1;
END WHILE
Run Code Online (Sandbox Code Playgroud)
另外...
DECLARE v VARCHAR(500) DEFAULT '';
DECLARE i INT DEFAULT 1;
REPEAT
SET v = ExtractValue(xml, '//child[$i]')
SET i = i+1;
IF v IS NOT NULL THEN
-- do something with v
END IF
UNTIL v IS NULL
Run Code Online (Sandbox Code Playgroud)
对不起,如果这里的语法有点不对劲,没有太多的mysql大师......