IBM DB2 XML Column Update并恢复为null

时间:2011-09-15 21:31:13

标签: xml db2

我有一个名为employee(id number, deatils XML)的表,deatils列可以为空。

我们说我已插入以下数据

insert into employee(1, '<xml><employee><name>Foo</name></employee></xml>');
insert into employee(2, null);
insert into employee(3, '<xml><employee><name>Bar</name></employee></xml>');

我有一个 IBM Optim 工具,它有一个知道错误,由于第二行中为null,因此不会将此数据复制/恢复到其他模式中。虽然提取数据会被提取得很好,但是插入其他模式会失败。

解决这个问题是使用一些虚拟xml更新null值,插入数据并在traget数据库中将该虚拟xml替换为null。我需要db2查询才能这样做。

我在做

update employee set details='<xml></xml>' where details=null;

在此更新之后,我可以提取数据并插入目标但是当我尝试更新虚拟xml时,我收到错误。

让我们说我尝试过以下(不会工作)

update employee set deatils=null where details='<xml></xml>';

由于xml存储为clob,基本上db2无法找到带有where子句的任何记录。

请帮忙!

2 个答案:

答案 0 :(得分:0)

请研究此tutorialtwo books。你需要

update employee set details=xmlparse(document('<xml></xml')) where details=null;

然后使用XQUERY语言查询

xquery db2-fn:xmlcolumn('employee')/xml;

请注意,XML列不是clobs。它们是您必须使用新功能和命令来处理的专用列。另外,定义可以深入到文档结构的正确XML索引,永远不要将XML转换为WHERE子句的普通varchar字符串(这会立即破坏性能)。

答案 1 :(得分:0)

XML中不存在

null。相反,你有一个&#34;空序列。&#34;您可以使用fn:boolean测试空序列。因此,如果您寻找一名员工并且找不到它,您可以将这些记录替换为null。

这样的事情:

UPDATE yourtable, XMLTABLE('$d/xml' passing details as "d"
   COLUMNS 
      empIsNull PATH 'if (fn:boolean(/xml/employee) then 0 else 1' ) as XMLINFO
SET yourtable.details = null
WHERE XMLINFO.empIsNull = 1