【问题标题】:IBM DB2 XML Column Update and revert to nullIBM DB2 XML 列更新并恢复为空
【发布时间】: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 子句找到任何记录。

请帮忙!

【问题讨论】:

    标签: xml db2


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多