我有一个名为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子句的任何记录。
请帮忙!
答案 0 :(得分:0)
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)
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