Oracle database
June 7
Отличие PIPELINED функций и TYPE в Oracle PL/SQL
Что такое 'TYPE'?
'TYPE' в Oracle — это способ определить собственные типы данных.
- для создания PL/SQL-коллекций (таблиц/массивов),
- объектов, если нужно работать со структурированными данными,
- в pipelined-функциях — как возвращаемое значение.
-- Объявляем тип таблицы CREATE OR REPLACE TYPE t_num_tab AS TABLE OF NUMBER;
Что такое PIPELINED FUNCTION?
PIPELINED-функции позволяют возвращать набор данных построчно, как будто это обычная таблица, и использовать их напрямую в SQL-запросах. Выглядят как обычные функции, но с ключевым словом PIPELINED.
Это очень мощный инструмент, если:
- 1нужно возвращать коллекции в SQL-стиле,
- вы обрабатываете много данных в PL/SQL, но хотите использовать SQL-join/where/group by и т.д.
Пример: TYPE + PIPELINED FUNCTION
1) Создаём тип строки и таблицы:
CREATE OR REPLACE TYPE emp_row_type AS OBJECT ( emp_name VARCHAR2(100), emp_salary NUMBER ); / CREATE OR REPLACE TYPE emp_table_type AS TABLE OF emp_row_type; /
CREATE OR REPLACE FUNCTION get_employees
RETURN emp_table_type
PIPELINED
AS
BEGIN
PIPE ROW(emp_row_type('Alice', 5000));
PIPE ROW(emp_row_type('Bob', 7000));
PIPE ROW(emp_row_type('Charlie', 6000));
RETURN;
END;
/SELECT * FROM TABLE(get_employees);
В результате получаем следующее:
Важные особенности PIPELINED FUNCTION
- Возвращает строки по одной — удобно для обработки больших объемов данных.
- Работает как виртуальная таблица — можно использовать в
SELECT * FROM TABLE(...). - Ускоряет производительность — результат не хранится целиком в памяти, строки «передаются по трубе».
- Обязателен возврат типа (RETURN TABLE OF …) — заранее объявленный
TYPE. - Поддерживает
PARALLEL_ENABLE— можно распараллеливать выполнение. - Можно использовать в представлениях и APEX — как источник данных.
- Хорошо подходит для оборачивания курсоров —
CURSOR → PIPE ROW.
Важные особенности TYPE
- Создает пользовательские типы данных — объекты (
OBJECT TYPE) и коллекции (TABLE OF OBJECT). - Может использоваться в SQL и PL/SQL — как в теле запроса, так и для переменных.
- Бывает в памяти (
PL/SQL TYPE) и в БД (CREATE TYPE): - PL/SQL типы — только внутри блоков, не видны из SQL.
- SQL типы — можно использовать в таблицах, функциях и т.д.
- Незаменим для
PIPELINEDфункций — обязательно описывать структуру возвращаемых данных. - Работает с BULK COLLECT и FORALL — помогает ускорять массовые операции.
- Можно использовать в параметрах процедур/функций — передавать таблицы значений.
- Совместим с JSON/XML генерацией — часто используется в Web API.
🧙♂️ Если хочешь прокачать навыки до гуру — этот раздел для тебя:
1. PIPELINED FUNCTION + CURSOR
FOR rec IN (SELECT * FROM emp) LOOP PIPE ROW(emp_row_type(rec.ename, rec.sal)); END LOOP;
🔹 2. PIPELINED FUNCTION + PIPELINED FUNCTION
- Сценарий: Когда одна pipelined функция вызывает другую (например, постобработка).
- Пример:
Внешняя функция вызывает внутреннюю черезSELECT * FROM TABLE(...), применяя фильтрацию, сортировку и т.д.
🔹 3. RETURN TYPE в функциях
RETURN emp_table_type PIPELINED
🔹 4. TYPE в SELECT
SELECT emp_row_type('John', 5000) FROM DUAL;🔹 5. Использование TYPE в PL/SQL переменных
v_emp emp_row_type := emp_row_type('Alice', 4000); 🔹 6. TYPE как параметр в процедурах / функциях
PROCEDURE process_emps(p_list IN emp_table_type)
🔹 7. TYPE + JSON/XML
SELECT JSON_OBJECT(emp_name, emp_salary) FROM TABLE(get_employees());
Полезные ссылки
1. Oracle Docs — Pipelined Functions
Файлы и скрипты
Исходные файлы можно найти в GIT.