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

How to retrieve multiple XML Nodes, stored as CLOB in DB2, as separate records?

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

这是table内容:

| 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;; |
| }                                        |

当我删除查询路径中的“[1]”时,它显示错误。

我该如何做我需要的?

谢谢。

注意:这是已经实现的东西,所以我无法更改设计,只能做一个适当的版本控制系统。

您的情况下的 XPath 表达式 LINE returns 一个 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
...