XMLAGG не работает
На страницу 1, 2 След.
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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   |
|
Полезность: Нет оценки
|
Кхм... А ведь сам пробовал со скобками - не получилось
 |
|
 |
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 нет в цфт банк) |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|