暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将XML转换为具有不存在字段的对象

ASKTOM 2019-11-13
157

问题描述

嗨,汤姆!

这是我的预设:
SQL> create or replace type my_type force is object(
  2    id number,
  3    val varchar2(4000)
  4  )
  5  /
Type created
SQL> set serveroutput on size 999999
SQL> begin
  2    dbms_output.put_line(xmltype(my_type(1, 'VAL')).getstringval);
  3  end;
  4  /
1VAL
PL/SQL procedure successfully completed
复制


然后我尝试将XML转换为对象:

SQL> declare
  2    l_val my_type;
  3  begin
  4    xmltype('1VAL').toobject(l_val);
  5    dbms_output.put_line('l_val.id = ' || l_val.id);
  6    dbms_output.put_line('l_val.id = ' || l_val.val);
  7  end;
  8  /
l_val.id = 1
l_val.id = VAL
PL/SQL procedure successfully completed
复制


好吧,效果很好。然后假设我们得到了标签VAL不存在的损坏数据:

SQL> declare
  2    l_val my_type;
  3  begin
  4    xmltype('1').toobject(l_val);
  5    dbms_output.put_line('l_val.id = ' || l_val.id);
  6    dbms_output.put_line('l_val.id = ' || l_val.val);
  7  end;
  8  /
l_val.id = 1
l_val.id = 
PL/SQL procedure successfully completed
复制


嗯,它工作得很好,我们只有VAL null。然后我们再次得到损坏的数据与额外的标签FAIL_ATTR:

SQL> declare
  2    l_val my_type;
  3  begin
  4    xmltype('1VALYOU FAIL').toobject(l_val);
  5    dbms_output.put_line('l_val.id = ' || l_val.id);
  6    dbms_output.put_line('l_val.id = ' || l_val.val);
  7  end;
  8  /
declare
  l_val my_type;
begin
  xmltype('1VALYOU FAIL').toobject(l_val);
  dbms_output.put_line('l_val.id = ' || l_val.id);
  dbms_output.put_line('l_val.id = ' || l_val.val);
end;
ORA-19031: Элемент или атрибут XML FAIL_ATTR не имеет соответствия в типе IBS.MY_TYPE
ORA-06512: на  "SYS.XMLTYPE", line 196
ORA-06512: на  line 4
复制


失败了!

所以这里是我的问题: 我可以以某种方式强制Oracle跳过这些在类型规范中没有声明的属性吗?对我来说,想念他们没关系。

专家解答

我已经与XML团队进行了检查-可悲的是,没有办法强制跳过额外的属性。

您必须构建自己的解决方案来进行映射。

或创建具有额外元素的类型;)
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论