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 字符串(这会立即破坏性能)。

【讨论】:

我可以使用 udpate employee set details='&lt;xml&gt;&lt;name&gt;foo&lt;/name&gt;&lt;/xml&gt;' where details is null 而不是 update employee set details=xmlparse(document('&lt;xml&gt;&lt;/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 列更新并恢复为空的主要内容,如果未能解决你的问题,请参考以下文章

IBM 工作灯。是不是可以安全地存储用户凭据并在没有用户交互的情况下恢复它们?

db2 简介

db2 delete表数据如何恢复,表没有删除

xml Doctr的Travis.xml(IBM DB2)

xml Doctr的Travis.xml(IBM DB2)

长文慎点IBM X3850服务器删除并重建虚拟机恢复过程