Как вернуть результаты запроса из функции если SQL формируется динамически?

В функции динамически формируется запрос, как можно вернуть его результаты из функции? Проблема в том, что кол-во столбцов в запросе каждый раз может быть разным и поэтому нельзя объявить тип-структуру чтобы возвратить результаты. Вот связанный вопрос, но там заранее определена структура.


Ответы (2 шт):

Автор решения: Akina

В функции динамически формируется запрос, как можно вернуть его результаты из функции?

Через temporary table.

create function test ()
returns int deterministic
begin
drop temporary table if exists tmp;
create temporary table tmp (id int);
insert into tmp values (10), (20);
return 1;
end
SELECT test();
SELECT * FROM tmp;
| test() |
| -----: |
|      1 |

| id |
| -: |
| 10 |
| 20 |

db<>fiddle here

→ Ссылка
Автор решения: 0xdb

Следуя формулировке вопроса, скорее всего, как в минимальном примере:

create table t (dt) as
    select to_date (column_value, 'yyyy-mm-dd') dt 
    from xmlTable ('"2022-03-06","2022-04-04"') 
/
set autoprint on 
create or replace function mons return sys_refcursor is
    cols varchar2 (32767);
    rc sys_refcursor;
begin
    for r in (select rownum rn, to_char (dt, 'Mon') mon from t order by dt) loop
        cols := cols||r.rn||' '||r.mon||',';
    end loop;
    open rc for 'select '||rtrim (cols, ',')||' 
                 from dual';
    return rc;
end;
/

Результат будет выглядеть так:

var rc refcursor
exec :rc := mons ()

       MAR        APR
---------- ----------
         1          2

insert into t values (date'2022-01-01')
/
exec :rc := mons ()

       JAN        MAR        APR
---------- ---------- ----------
         3          1          2
→ Ссылка