如何检索多个 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 "I am being called"; |
| } |
当我删除查询路径中的“[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
...
我有一个 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 "I am being called"; |
| } |
当我删除查询路径中的“[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
...