0

我的test表有两列,一列是message_xmltype XML,另一列是company_namestype VARCHAR。我想在每个 XML 行中搜索一个单词,如果 XML 有它,则导出该 XML。

下面是存储在 DB2 中的 2 个 xml 示例:

<breakfast_menu>
  <food>
    <name>Belgian Waffles</name>
    <price>$5.95</price>
    <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
    <calories>650</calories>
  </food>
  <food>
    <name>Homestyle Breakfast</name>
    <price>$6.95</price>
    <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
    <calories>950</calories>
  </food>
</breakfast_menu>

<breakfast_menu>
  <food>
    <name>Strawberry Belgian Waffles</name>
    <price>$7.95</price>
    <description>Light Belgian waffles </description>
    <calories>900</calories>
  </food>
  <food>
    <name>French Toast</name>
    <price>$4.50</price>
    <description>Thick slices of bread</description>
    <calories>600</calories>
  </food>
</breakfast_menu>

在这些 XML 文档中,我想找到单词“bacon”(它可以在 XML 中的任何位置),然后将该 XML 导出到文本文件中。

我尝试CONTAINS通过首先将 XML 转换为字符串来使用,但我收到关于VARCHAR.

xmlcast(test.message_xml as varchar(255)) as export_XML是我编写的将 XML 转换为字符串的代码

[错误代码:-16061,SQL 状态:10608] 值“429541527005540133404021548131000109999-12-312...”不能构造为数据类型“VARCHAR_255”或强制转换(使用隐式或显式强制转换)。错误 QName=err:FORG0001.. SQLCODE=-16061, SQLSTATE=10608, DRIVER=4.15.82

接下来我直接尝试使用CONTAINS,但我收到有关未找到文本索引的错误。所以,我试图创建一个索引,但我也得到了一个错误,错误读取

“在 "L) as (create index" 之后发现了一个意外的标记 "idx1"。预期的标记可能包括:"JOIN""

对于代码:在 test(message_xml) 上创建索引 idx1 使用 xmlpattern '/XML' as varchar(9999) 生成密钥

我的代码是:

@export on;
@export set filename="D:\temp\searchResults.txt";
@set maxrows 10;
with Tempresult(export_xml)
as
(
create index idx1 on test(message_xml)
generate key using xmlpattern '/XML'
as varchar(9999)
select 
    test.message_xml as export_XML
from test where source_id = 14
and trans_timestamp between '2015-10-01' and '2016-04-30'
)
select
    export_XML
    from Tempresult
    //where LOCATE('bacon',export_XML) > 0;
    where CONTAINS(export_XML, ' "bacon" ') = 1;
@export off;

在没有创建索引的情况下使用上面的代码,我得到了这个错误:

[错误代码:-443,SQL 状态:38799] 例程“*RCH_8K64”(特定名称“”)返回了错误 SQLSTATE,诊断文本为“CTE0199 没有对应于列“MESSAGE_XML”的文本索引。SQLCODE=-443, SQLSTATE=38799,驱动程序=4.15.82

我什至尝试使用LOCATE, CONVERTCAST但没有用。有人可以帮我解决这个问题吗?

我认为解决方案可能是将 XML 转换为字符串并为 xml 列应用CONTAINSLOCATE创建索引。如果我错了,请纠正我。

4

2 回答 2

2

您应该利用PureXMLDB2 的特性。例如,以下WHERE子句将搜索bacon元素namedescription.

WHERE XMLEXISTS('/breakfast_menu/food[contains(name,"bacon") or contains(description,"bacon")] ' PASSING message_xml)
于 2016-05-26T13:28:46.463 回答
0

由于 XMLSERIALIZE(我认为),我找到了一个以牺牲一些运行时间为代价的解决方案。

select message_xml AS export_xml from test where LOCATE('bacon',XMLSERIALIZE(xmlquery('$clam//breakfast_menu ' passing test.message_xml as "clam") as CLOB)) > 0

现在这对我有用。有时我收到一条错误消息:

[错误代码:-433,SQL 状态:22001] 值“et”>0.00 太长.. SQLCODE=-433,SQLSTATE=22001,DRIVER=4.15.82

我无法弄清楚这个错误是什么。

于 2016-05-27T18:51:46.677 回答