Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Всем привет, давно не виделись.

Ковырялся как то и случайно для себя наковырял такую вот прелесть:
create type foo as object (bar number);
/
 
Type created
create type foo_tbl as table of foo;
/
 
Type created
create type fooo as object (bar number, foo_coll foo_tbl);
/
 
Type created
select xmltype(fooo(1,foo_tbl(foo(2)))).extract('*').getStringVal() from dual;
 
XMLTYPE(FOOO(1,FOO_TBL(FOO(2))
--------------------------------------------------------------------------------
<FOOO>
  <BAR>1</BAR>
  <FOO_COLL>
    <FOO>
      <BAR>2</BAR>
    </FOO>
  </FOO_COLL>
</FOOO>

Странно, но раньше я почему-то не встречал использование конструктора XMLType, принимающего ЭниДату. Хотя фишка выглядит наиофигеннейше. Еще более офигенно, конечно, было бы если бы из полученного таким образом XMLType, столь же непринужденно можно было бы собрать эту АниДату обратно. Однако не нашел и, полагаю, такой фишки все же нет... или таки быть может есть? Ведь о том, что в конструктор XMLType можно преедать объект я ведь тоже не знал.
10 фев 11, 11:08    [10212796]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Elic
Member

Откуда:
Сообщений: 29990
Zloxa
Ведь о том, что в конструктор XMLType можно преедать объект я ведь тоже не знал.
А как часто ты заглядывал в dbmsxmlt.sql ?
10 фев 11, 11:34    [10212992]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Elic
]А как часто ты заглядывал в dbmsxmlt.sql ?

Сегодня заглянул впервые. Но намека все же не понял, прости, для меня он оказался слишком тонок.
10 фев 11, 11:56    [10213212]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Elic
Member

Откуда:
Сообщений: 29990
Zloxa
Сегодня заглянул впервые. Но намека все же не понял, прости, для меня он оказался слишком тонок.
Документация порой весьма запутана. А исходник - это кратко изложенное API, нередко даже с комментариями.
dbmsxmlt.sql
  constructor function XMLType (xmlData IN AnyData,
10 фев 11, 13:16    [10214030]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Elic, понял.

ЭниДату в конструткоре я видел достаточно давно и в документации. Вот только что это значит на самом деле, осмыслил как то недавно и невзначай, сразу стал пробовать сувать туда что не лень, и думать как и где это можно использовать. Фантазия, прямо скажем разыгралась, но ее развитию сильно препятствовала мысль, что объект так просто сохраненный в XML, как-то нелепо и уныло воспроизводить из оного классическим экстрактом. А где порыть - придумать так и не смог. В голове думать мешает целый ворох мыслей, убеждающих меня, что рыть и не стоит, вряд-ли такой функционал реализован. Решил попробовать запостится, авось мне скажут что я дурак, а истина где-то рядом.
10 фев 11, 13:36    [10214202]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
alexander sychev
Member

Откуда:
Сообщений: 14
Zloxa
... если бы из полученного таким образом XMLType, столь же непринужденно можно было бы собрать эту АниДату обратно


да нивапрос. Только схему лучше зарегистрировать

MEMBER PROCEDURE toObject(SELF in sys.XMLType, object OUT "<ADT_1>",
schema in varchar2 := NULL,
element in varchar2 := NULL),

-- вот оно - DBMS_XMLSCHEMA.REGISTER. А то тормозить будет.
10 фев 11, 15:31    [10215147]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
alexander sychev
да нивапрос.

аааа я дебил. Я ведь пялился в этот метод, меня смутил не понятный мне тип "<ADT_1>"... но в доке то, блин, суть описана.

Спасибо огромное.

declare
  a_foo fooo;
begin
 for i in  (select xmltype(fooo(1,foo_tbl(foo(2)))) xml from dual)
 loop
   i.xml.toObject(a_foo);
   dbms_output.put_line(a_foo.foo_coll(1).bar);
 end loop;
end;
/
 
2
10 фев 11, 16:13    [10215483]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Zloxa
Еще более офигенно, конечно, было бы если бы из полученного таким образом XMLType, столь же непринужденно можно было бы собрать эту АниДату обратно.

Zloxa
Я ведь пялился в этот метод, меня смутил не понятный мне тип "<ADT_1>"... но в доке то, блин, суть описана.

А теперь тебя ничего не смущает?
Ведь если в xml у тебя коллеция, то надо дополнительно еще заюзать xmlsequence, чтоб получить поэлементно и тогда уж toobject. И потом получившуюся коллекцию снова засунуть в AnyData путем вазова ConvertCollection.
10 фев 11, 16:58    [10215892]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
dbms_photoshop
А теперь тебя ничего не смущает?

я не понял на что ты намекаешь :(
declare
  a_foo fooo;
begin
 for i in  (select xmltype(fooo(1,foo_tbl(foo(2),foo(3)))) xml from dual)
 loop
   i.xml.toObject(a_foo);
   dbms_output.put_line(a_foo.foo_coll(1).bar);
   dbms_output.put_line(a_foo.foo_coll(2).bar);
 end loop;
end;
/
 
2
3
 
PL/SQL procedure successfully completed
10 фев 11, 18:13    [10216423]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Zloxa
я не понял на что ты намекаешь :(
В тексте твоего первого сообщения речь шла про anydata.
В ней может быть не только объект, но и скалярный тип либо же коллекция.
Тем не менее xml можно преобразовать в anydata что бы он там не содержал, только case надо написать небольшой.
11 фев 11, 03:39    [10217876]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
А может ли ктноить подсказать, можно ли с помощью toObject преобразовать xml подобного вида:
<BAR>
  <VAL>
    <FOO>
      <VAL>1</VAL>
    </FOO>
    <SUBFOO>
      <VAL>2</VAL>
      <EXTVAL>3</EXTVAL>
    </SUBFOO>
  </VAL>
</BAR>
В данном случае bar.val - коллекция объектов foo a subfoo - наследник объекта foo, представляющий расширенный набор атрибутов.

По задумке должно бы пролезть в такого рода стурктуру:
create type foo as object (val number) not final;
/
create or replace type subfoo under foo(extval number);
/
create type foo_tbl as table of foo;
/
create type bar as object(val foo_tbl);
/

туда - хоть както пролазит, хоть вовсе не так, как хотелось бы, имя второго тэга совпадает с именем надкласса
select xmltype(bar(foo_tbl(foo(1),subfoo(2,3)))).extract('*').getStringVal() from dual;
 
XMLTYPE(BAR(FOO_TBL(FOO(1),SUB
--------------------------------------------------------------------------------
<BAR>
  <VAL>
    <FOO>
      <VAL>1</VAL>
    </FOO>
    <FOO>
      <VAL>2</VAL>
      <EXTVAL>3</EXTVAL>
    </FOO>
  </VAL>
</BAR>
а вот обратно - что-то не выдюжу никак :(
+

declare
 x bar;
begin
  XMLType(
'<BAR>
  <VAL>
    <FOO>
      <VAL>1</VAL>
    </FOO>
    <SUBFOO>
      <VAL>2</VAL>
      <EXTVAL>3</EXTVAL>
    </SUBFOO>
  </VAL>
</BAR>').ToObject(x);
  dbms_output.put_line(x.val.count());
end;
 
ORA-19031: XML element or attribute SUBFOO does not match any in type COMMON.FOO
ORA-06512: at "SYS.XMLTYPE", line 183
ORA-06512: at line 5

declare
 x bar;
begin
  XMLType(
'<BAR>
  <VAL>
    <FOO>
      <VAL>1</VAL>
    </FOO>
    <FOO>
      <VAL>2</VAL>
      <EXTVAL>3</EXTVAL>
    </FOO>
  </VAL>
</BAR>').ToObject(x);
  dbms_output.put_line(x.val.count());
end;
 
ORA-19031: XML element or attribute EXTVAL does not match any in type COMMON.FOO
ORA-06512: at "SYS.XMLTYPE", line 183
ORA-06512: at line 5
15 фев 11, 17:44    [10240287]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Объясню зачем надо. Сейчас рисую интерфейсы коммуникации нескольких приложений посредством обмена XML сообщениями. Хотелось бы заложить структуру наиболее близкую к ораклиным канонам, чтобы, если вдруг чо, на коленочках,побыдренькому можно было разобрать xml, представить в виде ораклиных структур.

Во всех интерфесах, вместе с элементами коллекций, передаю и информацию об удалении этих эжлементов. Соответственно информация об удалении объекта - элемента коллекции не может быть расшириена атрибутами этого объекта.

в дтд, то что я хочу, выглядило бы примерно так:
<!ELEMENT BAR (VAL)>
<!ELEMENT VAL ((OBJ|DELETEDOBJREF)+)>
<!ELEMENT OBJ (ID,ATTR1,ATTR2)>
<!ELEMENT DELETEDOBJREF (ID)>

В принципе я могу обойтись и введением атрибута статус и объявлением всех атрибутов объекта не обязательными:
<!ELEMENT BAR (VAL)>
<!ELEMENT VAL (OBJ+)>
<!ELEMENT OBJ (ID,STATUS,ATTR1?,ATTR2?)>
Тогда бы все везде пролезло, но как то не шибко мне такая идея нравится.
15 фев 11, 18:18    [10240518]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
OldOwl
Guest
схема нужна, без нее вся эта байда как со свиньи шерсть добывать...

begin
  dbms_xmlschema.registerSchema(schemaURL => 'foo.xsd',schemaDoc => 
  '<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSpy v2008 rel. 2 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb">
	<xs:element name="VAL"  xdb:SQLType="VAL_TYP">
		<xs:complexType mixed="true">
			<xs:sequence>
				<xs:element ref="FOO" minOccurs="0" maxOccurs="unbounded" 
        xdb:SQLCollType="FOO_COLL"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="FOO" xdb:SQLType="FOO_TYP">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="VAL" type="xs:int"/>
				<xs:element name="EXTVAL" type="xs:integer" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="BAR" xdb:SQLType="BAR_TYP">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="VAL"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>
'
  );
end;
/


SELECT * FROM USER_TYPES;

declare
 x bar_TYP;
begin
  XMLType(
'<BAR>
  <VAL>
    <FOO>
      <VAL>1</VAL>
    </FOO>
    <FOO>
      <VAL>2</VAL>
      <EXTVAL>3</EXTVAL>
    </FOO>
  </VAL>
</BAR>').ToObject(x,'foo.xsd','BAR');
  dbms_output.put_line(x.val.foo(1).val);
end;
/

BEGIN
  DBMS_XMLSCHEMA.deleteSchema(schemaURL => 'foo.xsd',delete_option => 4);
END;
/



вот так, грязненько и приблизительно, но если понравится - можно и extension типа сделать, и <FOO xsi:type="SUBFOO"> указать...
16 фев 11, 03:41    [10242020]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: object => xmltype =>object  [new]
EDUARD_2
Member

Откуда:
Сообщений: 283
Zloxa,

create or replace type body t$object is
  member function getTypeName return varchar2 is
    a ANYDATA := ANYDATA.ConvertObject(self);
  begin
    return a.GetTypeName();
  end;

  member function serialize return xmltype is
  begin
    return xmltype(anydata.ConvertObject(self));
  end;

  member procedure unserialize(param in out nocopy xmltype) is
  begin
    execute immediate 
      'declare
         vO ' || self.getTypeName || '; 
         vparam xmltype := :param;
       begin 
         vparam.toObject(vO);
         :self := vO;
       end;'
    using in param, out self;
  end;
end;


После этого наследников можно хоть 10 раз записать куда-нибудь и вытащить.
15 ноя 13, 16:18    [15137652]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
EDUARD_2
Member

Откуда:
Сообщений: 283
упс, сообщение то давнейшее, сорри )
15 ноя 13, 16:18    [15137657]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: object => xmltype =>object  [new]
EDUARD_2
Member

Откуда:
Сообщений: 283
В 12c (12.1.0.2) - все перестало работать!

create or replace type test_12c as object
(
  fId integer,
  fData varchar2(255),
  fEditRules xmltype,

  constructor function test_12c(pId int, pData varchar2) return self as result
)

/

create or replace type body test_12c is

  constructor function test_12c(pId int, pData varchar2) return self as result is
  begin
    fId := pId;
    fData := pData;
    return;
  end;
end;

/


declare 
  xml xmltype;
  obj test_12c;
  objcp test_12c;
begin
  obj := test_12c(1, 'test');
  --obj.fEditRules := xmltype('<null/>');
  xml := xmltype(obj);
  xml.toObject(objcp);
  :obj := xmltype(obj).getClobVal();
  :objcp := xmltype(objcp).getClobVal();
end;


Все дело в поле XMLTYPE в типе...
23 ноя 15, 12:47    [18459013]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
EDUARD_2
Member

Откуда:
Сообщений: 283
Ошибку получаю
автор
ORA-19029: Невозможно преобразовать заданный XMLType в требуемый тип


Если же
obj.fEditRules := xmltype('<null/>');
расскоментить - то все норм.
23 ноя 15, 12:49    [18459027]     Ответить | Цитировать Сообщить модератору
 Re: object => xmltype =>object  [new]
EDUARD_2
Member

Откуда:
Сообщений: 283
В общем это Bug 20401981
23 дек 15, 08:12    [18597411]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить