如何在DB2中检索作为CLOB存储的多个XML节点作为单独的记录?

时间:2015-01-15 22:55:31

标签: sql xml db2

我有一个表,其中有一些代码在DB2 7中保存为clobs。

这是表格内容:

| CODEID | CODEXML      |CODECREATIONTS                  |
|--------|--------------|--------------------------------|
|      1 |       <CLOB> | January, 14 2015 22:33:49+0000 |
|      2 |       <CLOB> | January, 15 2015 22:33:49+0000 |

每个clob都有这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT_MODULE Ver="1" VerComment="This is a script created for testing">
    <LANGUAGE>CustomLanguage</LANGUAGE>
    <SCRIPT>
        <LINE>function print()</LINE>
        <LINE>{</LINE>
        <LINE>\t return \"I am being called";</LINE>
        <LINE>}</LINE>
    <SCRIPT>
    <ATTRIBUTES></ATTRIBUTES>
</ROOT_MODULE>

当我发出此查询时:

select
    xmlCodeTable.lineCode
from
    myCodes,
    XMLTABLE(           
            '$xmlDoc/ROOT_MODULE/SCRIPT' PASSING XMLPARSE(DOCUMENT myCodes.codeXML) AS "xmlDoc"
            COLUMNS
            lineCode varchar(50) PATH 'LINE[1]'
         ) AS xmlCodeTable
where codeID = 1

我明白了:

| lineCode        |
|-----------------|
| function print()|

我需要的是获得这个:

| lineCode                                 |
|------------------------------------------|
| function print()                         |
| {                                        |
| \t return &quot;I am being called&quot;; |
| }                                        |

当我摆脱&#34; [1]&#34;在查询路径中,它显示了一个错误。

我如何做我需要的?

感谢。

注意:这已经实现了,所以我无法改变设计,只是做一个合适的版本控制系统。

1 个答案:

答案 0 :(得分:0)

您的案例中的XPath表达式LINE会返回一系列LINE元素,这显然与VARCHAR不兼容。解决此问题的一种方法是重写您的查询:

select
    xmlCodeTable.lineCode
from
    myCodes,
    XMLTABLE(           
            '$xmlDoc/ROOT_MODULE/SCRIPT/LINE' 
            PASSING XMLPARSE(DOCUMENT myCodes.codeXML) AS "xmlDoc"
            COLUMNS
            lineCode varchar(50) PATH '.'
         ) AS xmlCodeTable
where codeID = 1

如果您还需要来自LINE父元素的内容,请使用相对XPath:

...
COLUMNS
lineCode varchar(50) PATH '.',
lang varchar(50)     PATH '../../LANGUAGE
...