powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание коллекции на основании динамического sql
8 сообщений из 8, страница 1 из 1
создание коллекции на основании динамического sql
    #40111525
Rus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, приветствую.
Есть вопрос.
У меня есть анонимный блок (прикладываю ниже), далее он будет преобразован в процедуру внутри пакета.
Нужно результат этого запроса куда-либо сохранять, с учётом того, что количество столбцов, возвращаемых запросом, может меняться (т.е. количество столбцов в p_pivot1 и p_pivot2 может меняться).
Есть вариант в процедуре прописать create table example as
далее её дропать
и делать так каждое выполнение процедуры,
но хочется попробовать более лаконичный вариант
есть ли возможность создать коллекцию с вариативным количеством столбцов, т.е. сформировать её на основании это динамического запроса? (честно говоря в плане коллекций слабо подкован, материалы читал, но по своему вопросу ничего не нашел).
Далее хочу джоинить эту коллекцию к другой табле.
Спасибо.


declare
p_sql clob default null;
p_pivot1 clob default null;
p_pivot2 clob default null;

begin

select listagg(xxx ||' '||REGEXP_REPLACE(zzz, '\s+', '_'), ', ') within group (order by xxx) list_for_pivot2
into p_pivot1
from tabl1
where cpd_id not in (3,4);

select listagg(xxx ||' '||REGEXP_REPLACE(zzz, '\s+', '_'), ', ') within group (order by xxx) list_for_pivot1
into p_pivot2
from tabl2
where enabled = 1;

p_sql :=
'
insert into test_pivot
select *
from
(
with actual_rates as
(
select t.*
from
(
select *
from com_prop cp
join com_m cm
on cm.id = cp.id
and cm.enabled = 1
where 1=1
and cp.enabled = 1
)
pivot
(
max(value)
for type in
(
'|| p_pivot1 ||'
)
) t
where t.id = 6
and t.type = 1
and t.status = 1
)
select *
from
(
select *
from actual_rates ar
join values cbv
on ar.id = cbv.id
and cbv.enabled = 1
join properties cmp
on cmp.profile = cbv.id
and cmp.enabled = 1
)
pivot
(
max(cbp_value)
for cbp_type_id in
(
'|| p_pivot2 ||'
)
)
)';

execute immediate p_sql;

end;
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40111561
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rus23
Коллеги, приветствую.
Есть вопрос.
У меня есть анонимный блок (прикладываю ниже), далее он будет преобразован в процедуру внутри пакета.
Нужно результат этого запроса куда-либо сохранять, с учётом того, что количество столбцов, возвращаемых запросом, может меняться (т.е. количество столбцов в p_pivot1 и p_pivot2 может меняться).
Есть вариант в процедуре прописать create table example as
далее её дропать
и делать так каждое выполнение процедуры,
но хочется попробовать более лаконичный вариант
есть ли возможность создать коллекцию с вариативным количеством столбцов, т.е. сформировать её на основании это динамического запроса? (честно говоря в плане коллекций слабо подкован, материалы читал, но по своему вопросу ничего не нашел).
Далее хочу джоинить эту коллекцию к другой табле.
Спасибо.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
declare
  p_sql clob default null;
  p_pivot1 clob default null;
  p_pivot2 clob default null;

 begin
 
         select listagg(xxx ||' '||REGEXP_REPLACE(zzz, '\s+', '_'), ', ') within group (order by xxx) list_for_pivot2
            into p_pivot1
        from tabl1
        where cpd_id not in (3,4);
 
        select listagg(xxx ||' '||REGEXP_REPLACE(zzz, '\s+', '_'), ', ') within group (order by xxx) list_for_pivot1
            into p_pivot2
        from  tabl2
        where enabled = 1;
     
        p_sql := 
    '
    insert into test_pivot 
    select *
    from
    (
    with actual_rates as
    (
    select t.*
    from 
    (
    select *
    from com_prop cp
    join com_m cm
        on cm.id = cp.id
        and cm.enabled = 1
    where 1=1
    and cp.enabled = 1
    )
    pivot
    (
    max(value)
    for type in
    (
    '|| p_pivot1 ||'
    )
    ) t
    where t.id = 6
    and t.type = 1
    and t.status = 1
    )
    select *
    from
    (
    select *
    from actual_rates ar
    join values cbv
        on ar.id = cbv.id
        and cbv.enabled = 1
    join properties cmp
        on cmp.profile = cbv.id
        and cmp.enabled = 1
    )
    pivot
    (
    max(cbp_value)
    for cbp_type_id in
    (
    '|| p_pivot2 ||'
    )
    )
    )';

  execute immediate p_sql;
 
 end;



Для оформления кода используйте, пожалуйста, тэг SRC.
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40112843
maglevdevice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вот так в лоб решать, то DBMS_SQL. Вроде такого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare
  lcCursor integer default DBMS_SQL.OPEN_CURSOR;
  lnColCnt number;
  ltDescTab DBMS_SQL.DESC_TAB;
  lsSQL varchar2(4000);
begin
  lsSQL := '
    select 1 a from dual
  ';
  DBMS_SQL.PARSE(lcCursor, lsSQL, DBMS_SQL.NATIVE);
  DBMS_SQL.DESCRIBE_COLUMNS(lcCursor, lnColCnt, ltDescTab);
  -- Now ltDescTab collection contains a list of columns 
  DBMS_SQL.CLOSE_CURSOR(lcCursor);
end;
/
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40112848
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rus23Далее хочу джоинить эту коллекцию к другой табле.


И как же ты будешь джоинить эту коллекцию не зная число полей? Смотри в сторону SQL MACRO и/или polymorphic function если версия позволяет.

SY.
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40112863
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На "чистых" коллекциях есть вариант запилить на базе anydata/anydataset, но стоит ли овчинка выделки...
Также возможно генерировать XML или JSON с последующим выходом на join xmltable/json_table
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40112869
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Также возможно генерировать XML или JSON с последующим выходом на join xmltable/json_table


IMHO мисье знает толко в практологии и ремонте двигателей автомобилей через выхлопную трубу )))
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40112877
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rus23

Далее хочу джоинить эту коллекцию к другой табле.


сразу (до пивот) джоинить не судьба?

.....
stax
...
Рейтинг: 0 / 0
создание коллекции на основании динамического sql
    #40112895
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
мисье знает толк

Даже не сомневайтесь.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание коллекции на основании динамического sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]