Как вернуть результаты запроса из функции если 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