Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание коллекции на основании динамического sql / 8 сообщений из 8, страница 1 из 1
12.11.2021, 20:25
    #40111525
Rus23
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание коллекции на основании динамического sql
Коллеги, приветствую.
Есть вопрос.
У меня есть анонимный блок (прикладываю ниже), далее он будет преобразован в процедуру внутри пакета.
Нужно результат этого запроса куда-либо сохранять, с учётом того, что количество столбцов, возвращаемых запросом, может меняться (т.е. количество столбцов в 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
12.11.2021, 22:02
    #40111561
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание коллекции на основании динамического sql
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
18.11.2021, 14:09
    #40112843
maglevdevice
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание коллекции на основании динамического sql
Если вот так в лоб решать, то 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
18.11.2021, 14:21
    #40112848
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание коллекции на основании динамического sql
Rus23Далее хочу джоинить эту коллекцию к другой табле.


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

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

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


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

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


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

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

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


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