pipelined-функции, первое знакомство
Статьи про Oracle -> Программирование
pipelined-функции, первое знакомство
v:1.0 14.08.2011
Петрелевич Сергей
В Oracle есть очень полезная возможность - способность функций возвращать таблицу данных, которую можно включать в другие выборки.
Такие возвращаемые таблицы являются коллекциями типа nested table, с ними могут работать и обычные функции, но чтобы получить максимальное быстродействие
имеет смысл использовать pipelined-функции, пример которой я приведу ниже.
Готовим типы данных:
create type TypeTestObject as
object
(
object_name varchar2(500),
object_id number,
object_type varchar2(10)
);
/*Создаем коллекцию типа nested table*/
create type TypeTestList as
table of TypeTestObject;
Создаем функцию:
create or replace function testFunction(pObject_type
in varchar2)
return TypeTestList pipelined as
begin
for i in (
select tao.OBJECT_NAME, tao.OBJECT_ID, tao.OBJECT_TYPE
from all_objects tao
where tao.OBJECT_TYPE=pObject_type
)
loop
pipe row (TypeTestObject(i.OBJECT_NAME, i.OBJECT_ID, i.OBJECT_TYPE));
end loop;
return;
end;
Открывается неявный курсор, извлекаются записи, из них создаются объекты типа TypeTestObject и помещаются в коллекцию.
Вот как эту функцию можно использовать в SQL-запросах:
select *
from
table(testFunction('TABLE')) t
where t.object_id=20;
Часто в конкретной системе есть сложная логика, которая кочует из одного запроса/отчета в другой, такую логику сложно понимать, и, если требуется, изменять. Поэтому часто бывает целесообразно общие логические блоки вынести в отдельные библиотеки и использовать уже их, вместо "копипастного" клонирования. В этом деле хорошо помогают представления (view), но сложную логику в них не запихнуть, и тут уже работают nested table и pipelined-функции.
Метки: PL/SQL SQL pipelined-функции nested table
Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.