В Oracle функция - это хранимая процедура, которая возвращает значение:
create or replace function get_number
return number is
begin
return 42;
end;
/
select get_number
from dual
/
Но возвращаемое значение не обязательно должно быть скалярным. Если это вложенная таблица, мы можем получить к ней доступ с помощью функции table()
и рассматривать ее как фактическую таблицу в предложении FROM запроса:
create or replace function get_numbers
return sys.odcinumberlist is
begin
return sys.odcinumberlist (23, 42);
end;
/
select *
from table(get_numbers)
/
Но если функция представляет собой конвейерную функцию, мы можем использовать pipe row
вызов для вывода любого значения, которое нам нравится. Таким образом, мы можем использовать programmati c logi c, чтобы определить вывод, например, сгенерировать список чисел от 1
до n
:
create or replace function get_n_numbers (p_n in number)
return sys.odcinumberlist pipelined is
begin
for n in 1..p_n loop
pipe row(0+n);
end loop;
return;
end;
/
select *
from table(get_n_numbers(3))
/
Вот демонстрация на db <> fiddle .
Конвейерные функции кажутся невероятно мощной функцией, но на практике сценарии их использования довольно нишевые. Например, мы можем использовать один , чтобы разбить строку на отдельные токены , но использование regex или xslt , вероятно, быстрее.