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

Откуда:
Сообщений: 388
create table xml (xml xmltype);

declare
  t clob := null;
begin
  for x in (select * from xml) loop
         select t||xmlserialize(content x.xml) into t from dual;
  end loop;
end;


Oracle 10.
Можно ли цикл заменить одним запросом, если да, то как?
23 мар 15, 12:08    [17418504]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
kaldorey
Member

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

Способ зависит от того, как вы будете потом эти результаты использовать.

А если только в рамках текущего примера, то bulk collect. Но не все то быстрее, что короче.
23 мар 15, 12:42    [17418775]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
Elic
Member

Откуда:
Сообщений: 29980
RTFM XMLAGG (FAQ)
23 мар 15, 12:44    [17418794]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
alx71
create table xml (xml xmltype);

declare
  t clob := null;
begin
  for x in (select * from xml) loop
         select t||xmlserialize(content x.xml) into t from dual;
  end loop;
end;


Oracle 10.
Можно ли цикл заменить одним запросом, если да, то как?

insert into xml
 select xmltype('<a/>') from dual
 union all
  select xmltype('<b/>') from dual
  
select xmlagg(xml).getclobval() from xml
23 мар 15, 12:45    [17418799]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
Элик уже ответил
23 мар 15, 12:45    [17418806]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
alx71
Member

Откуда:
Сообщений: 388
Дык bulk collect все равно цикл по коллекции потребует.
Дальнейшее использование планируется так:

select
XMLElement
("TAG",
   XMLAttribute(length(t) as "len"),
   t
)
from dual;
23 мар 15, 12:48    [17418824]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
alx71
Дык bulk collect все равно цикл по коллекции потребует.
Дальнейшее использование планируется так:

select
XMLElement
("TAG",
   XMLAttribute(length(t) as "len"),
   t
)
from dual;

Во-первых XMLAttributes
Во-вторых это полный бред, при преобразовании полученного clob в значение элемента его длина поменяется за счет перекодировки спецсимволов
select XMLElement ("TAG",
                   XMLAttributes(length(t) as "len"),
                   t)
 from
  (select xmlagg(xml).getclobval() t from xml)
23 мар 15, 13:06    [17419000]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
alx71
Member

Откуда:
Сообщений: 388
Да, действительно, длина меняется...
23 мар 15, 13:27    [17419207]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
alx71
Member

Откуда:
Сообщений: 388
Хотя при разборе восстанавливается обратно, так что все должно быть нормально, думаю.
Бред, да, а что поделаешь, не я это придумал...
23 мар 15, 13:35    [17419282]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли написать короче?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
alx71
Бред, да, а что поделаешь, не я это придумал...

Уверен, что если бы ты изложил проблему целиком коллективный разум предложил бы тебе более разумное решение чем конкатить и считать длину
23 мар 15, 14:02    [17419493]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить