У меня база данных 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 пропускать такие атрибуты, которые не объявлены в спецификации типа? Для меня было бы хорошо пропустить их.