IBM DB2 XML 列更新并恢复为空
Posted
技术标签:
【中文标题】IBM DB2 XML 列更新并恢复为空【英文标题】:IBM DB2 XML Column Update and revert to null 【发布时间】:2011-09-15 21:31:12 【问题描述】:我有一个名为 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 数据库中用 null 替换该虚拟 xml。我需要 db2 查询才能这样做。
我在做
update employee set details='<xml></xml>' where details=null;
在此更新之后,我可以提取数据并插入到目标中,但是当我尝试更新虚拟 xml 时出现错误。
假设我已经尝试过下面的方法(这不会起作用)
update employee set deatils=null where details='<xml></xml>';
由于 xml 存储为 clob,基本上 db2 无法使用我的 where 子句找到任何记录。
请帮忙!
【问题讨论】:
【参考方案1】:请研究这个tutorial,或者这些twobooks。你需要
update employee set details=xmlparse(document('<xml></xml')) where details=null;
然后使用 XQUERY 语言进行查询
xquery db2-fn:xmlcolumn('employee')/xml;
请注意 XML 列不是 clob。它们是专门的列,您必须使用为此而设计的新功能和命令来处理它们。此外,定义可以深入到文档结构中的适当 XML 索引,并且永远不要将 XML 转换为 WHERE 子句的普通 varchar 字符串(这会立即破坏性能)。
【讨论】:
我可以使用 udpateemployee set details='<xml><name>foo</name></xml>' where details is null
而不是 update employee set details=xmlparse(document('<xml></xml')) where details=null;
但我该如何做反向操作?【参考方案2】:
null 在 XML 中不存在。相反,您有一个“空序列”。您可以使用 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
【讨论】:
以上是关于IBM DB2 XML 列更新并恢复为空的主要内容,如果未能解决你的问题,请参考以下文章