CftClub.ru
Клуб специалистов ЦФТ-Банк

XMLAGG не работает
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mishacure
Участник


Вступление в Клуб: 20.02.2009
СообщениеВт Апр 14, 2009 15:29   XMLAGG не работает Ответить с цитатой
Полезность: Нет оценки
Не удается создать представление. Не компилируется

type main is
select u(
u.[NAME],

XMLAGG ( xmlelement("USERNAME",u.USERNAME) )

in [USER]
group by u.NAME
;

Хотя аналогичный запрос в ORACLE Developer работает нормально.
Хотелось бы пользоваться этой функцией, потому что она дает инетересные возможности.
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеСр Апр 15, 2009 06:04    Ответить с цитатой
Полезность: Нет оценки
может такое решение подойдет?
lexus
Профи


Вступление в Клуб: 28.09.2007
СообщениеСр Апр 15, 2009 06:30    Ответить с цитатой
Полезность: 1
Одной скобки не хватает:
Код:
type main is
select u(
u.[NAME],

XMLAGG ( xmlelement("USERNAME",u.USERNAME)))

in [USER]
group by u.NAME
;


И вот теперь ошибка у меня такая вылезла:
Код:
ORA-20300: APP-PL/PLUS: PLP-BAD_SYNONYM_OWNER: Владелец PUBLIC синонима XMLAGG не является владельцем схемы IBSO
Mishacure
Участник


Вступление в Клуб: 20.02.2009
СообщениеСр Апр 15, 2009 08:22    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
может такое решение подойдет?

Нет к сожалению, дело в том что это не просто функция, а в данном случае это как бы функция группировки.
Этог сложный случай. Даже если в Девелопере к функции приписать слева SYS. , то она компилироваться не будет. А PL/Plus видимо при трансляции в SQL пытается сбоку приписать владельца и поэтому компиляция обламывается.
Пока не понятно как это можно обойти. Хорошо если бы разработчики ЦФТ посмотрели на эту проблему.
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеСр Апр 15, 2009 08:48    Ответить с цитатой
Полезность: Нет оценки
там и группировка есть...
Код:

SELECT
0 ID,
A1_1.C_NAME C_1,
xmlagg ( xmlelement("USERNAME",A1_1.C_USERNAME) ) C_2
 FROM Z#USER A1_1
 WHERE
  ( SYS_CONTEXT('IBS_SYSTEM','ADMIN')='1' OR
    SYS_CONTEXT('IBS_RIGHTS','409904153')='1'
    AND
    ( SYS_CONTEXT('IBS_RIGHTS','USER')='1'
    )
  )

 AND SYS_CONTEXT('IBS_OPTIONS','409904153') is null
 AND SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') is null
group by A1_1.C_NAME
Mishacure
Участник


Вступление в Клуб: 20.02.2009
СообщениеСр Апр 15, 2009 10:50    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
там и группировка есть...
Код:

SELECT
0 ID,
A1_1.C_NAME C_1,
xmlagg ( xmlelement("USERNAME",A1_1.C_USERNAME) ) C_2
 FROM Z#USER A1_1
 WHERE
  ( SYS_CONTEXT('IBS_SYSTEM','ADMIN')='1' OR
    SYS_CONTEXT('IBS_RIGHTS','409904153')='1'
    AND
    ( SYS_CONTEXT('IBS_RIGHTS','USER')='1'
    )
  )

 AND SYS_CONTEXT('IBS_OPTIONS','409904153') is null
 AND SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') is null
group by A1_1.C_NAME


да, точно, но выдает ошибку ...
заработало когда добавил CAST

CAST (xmlagg ( xmlelement("USERNAME",A1_1.C_USERNAME) ) as VARCHAR2(1000))
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеСр Апр 15, 2009 11:25    Ответить с цитатой
Полезность: Нет оценки
Вопрос остается открытым:
как делать PL/SQL вставки в представление PL/Plus?
Mishacure
Участник


Вступление в Клуб: 20.02.2009
СообщениеСр Апр 15, 2009 11:29    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
Вопрос остается открытым:
как делать PL/SQL вставки в представление PL/Plus?

спасибо, все работает.
хотя конечно это не PL/PLUS представление, а простое, но вобщем это тоже нормально.
lexus
Профи


Вступление в Клуб: 28.09.2007
СообщениеСр Апр 15, 2009 11:36    Ответить с цитатой
Полезность: 1
prog пишет:
Вопрос остается открытым:
как делать PL/SQL вставки в представление PL/Plus?

Согласно документации:
Цитата:
Существует также синтаксис задания PL/SQL выражений путем заключения их в фигурные скобки {}


Вот, поиском попалось:
Цитата:
select s( s.job : id,
<...>
to_char({trunc(sysdate)} + (nvl(s.date_executed, sysdate) - s.date_run), 'HH24:MI:SS') : run_time,
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеСр Апр 15, 2009 11:40    Ответить с цитатой
Полезность: Нет оценки
Вуаля!

Код:

type main is
select u(
u.[NAME],

{xmlagg ( xmlelement("USERNAME",a1.C_USERNAME) )}
)

in [USER]
group by u.NAME
;


Спасибо lexus!
lexus
Профи


Вступление в Клуб: 28.09.2007
СообщениеСр Апр 15, 2009 11:43    Ответить с цитатой
Полезность: Нет оценки
Кхм... А ведь сам пробовал со скобками - не получилось Embarassed
Laughing
Mishacure
Участник


Вступление в Клуб: 20.02.2009
СообщениеСр Апр 15, 2009 14:04    Ответить с цитатой
Полезность: Нет оценки
Вот такой окончательный результат получился. Все работает. Спасибо

type main is
select u(
u.[NAME],

{replace( replace(replace( replace(
CAST (
XMLAGG( xmlelement("USERNAME",C_USERNAME)) as VARCHAR2(1000))
,'<USERNAME></USERNAME>','пусто,') ||'@'
,'<USERNAME>' , '')
,'</USERNAME>',',')
,',@','')}

)
in [USER]
group by u.NAME
having count(1) > 1
;
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеПн Фев 22, 2016 19:54    Ответить с цитатой
Полезность: Нет оценки
если кусок кода в фигурных скобках {} слишком длинный то получаем
Код:
ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения

ORA-06512: на  "IBS.PLIB", line 8333

ORA-06512: на  "IBS.PLIB", line 8458

ORA-06512: на  "IBS.PLIB", line 6494

ORA-06512: на  "IBS.PLIB", line 9033

ORA-06512: на  "IBS.PLIB", line 9403

ORA-06512: на  "IBS.PLIB", line 8959

ORA-06512: на  "IBS.PLIB", line 15250

ORA-06512: на  "IBS.PLIB", line 17024

ORA-06512: на  "IBS.PLIB", line 15240

ORA-06512: на  "IBS.PLIB", line 17051

ORA-06512: на  "IBS.PLIB", line 17096

ORA-06512:
begin
 IBS.executor.set_debug(:DLEVEL);
 :res:=IBS.method.change_short_name(:METH_ID,:METH_SN,TRUE,FALSE,FALSE); commit;
end;


как обойти проблему не понятно..
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеСр Фев 24, 2016 11:14    Ответить с цитатой
Полезность: Нет оценки
Насколько я помню, кусок не может превышать 32 кило. можно собрать из нескольких кусков.
_________________
всегда есть как минимум 2 выхода
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеСр Фев 24, 2016 11:43    Ответить с цитатой
Полезность: Нет оценки
вот это получается скомпилировать
Код:
SELECT e( {XMLELEMENT("Department",
   XMLAGG(XMLELEMENT("Employee",
   a1.job_id||' '||a1.last_name)
   ORDER BY a1.last_name))
   as "Dept_list"  } : xml)

   in [employees]
   WHERE e.[department_id] = 30;


а если впихнуть }{ посреди конструкции с XMLELEMENT

Код:
SELECT e( {XMLELEMENT("Department",
   XMLAGG(XMLELEMENT("Employee",
   a1.job_id||' '||a1.last_name)
   }{ORDER BY a1.last_name))
   as "Dept_list"  } xml)

   in [employees]
   WHERE e.[department_id] = 30;


уже не компилится


сам запрос просто для примера (ТБП employees нет в цфт банк)
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru