конвертировать xml в объект с неизвестным тегом в Oracle - PullRequest
0 голосов
/ 07 ноября 2019

У меня база данных Oracle 11.2.0.4.0 - 64 бита. Вот мой пресет:

SQL> 
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  /
<MY_TYPE><ID>1</ID><VAL>VAL</VAL></MY_TYPE>
PL/SQL procedure successfully completed

Затем я пытаюсь преобразовать XML в объект:

SQL> declare
  2    l_val my_type;
  3  begin
  4    xmltype('<MY_TYPE><ID>1</ID><VAL>VAL</VAL></MY_TYPE>').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('<MY_TYPE><ID>1</ID></MY_TYPE>').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('<MY_TYPE><ID>1</ID><VAL>VAL</VAL><FAIL_ATTR>YOU FAIL</FAIL_ATTR></MY_TYPE>').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('<MY_TYPE><ID>1</ID><VAL>VAL</VAL><FAIL_ATTR>YOU FAIL</FAIL_ATTR></MY_TYPE>').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 пропускать такие атрибуты, которые не объявлены в спецификации типа? Для меня было бы хорошо пропустить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...