Мисля, че е възможно, макар и доста сложно, да се напише конвейерна таблична функция, която връща променлива структура . Вашата функция за конвейерна таблица ще използва интерфейса на Oracle Data Cartridge и магията на типа AnyDataSet, за да върне динамична структура по време на изпълнение. След това можете да го използвате в следващите SQL изрази, сякаш е таблица, т.е.
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Още няколко препратки, които обсъждат същата примерна реализация
- Динамично SQL Pivoting
- Внедряване на интерфейсния подход раздел на ръководството за разработчици на Oracle Data Cartridge
-
Метод4. След като изтеглите и инсталирате PL/SQL кода с отворен код, ето пълно изпълнение:
--Create sample table. create table branch_data as select '100' BranchName,'1001010' CustomerNo from dual UNION ALL select '100' BranchName,'1001011' CustomerNo from dual UNION ALL select '103' BranchName,'1001012' CustomerNo from dual UNION ALL select '104' BranchName,'1001013' CustomerNo from dual UNION ALL select '104' BranchName,'1001014' CustomerNo from dual UNION ALL select '104' BranchName,'1001015' CustomerNo from dual UNION ALL select '105' BranchName,'1001016' CustomerNo from dual UNION ALL select '105' BranchName,'1001017' CustomerNo from dual UNION ALL select '106' BranchName,'1001018' CustomerNo from dual; --Create a dynamic pivot in SQL. select * from table(method4.dynamic_query( q'[ --Create a select statement select --The SELECT: 'select'||chr(10)|| --The column list: listagg( replace(q'!sum(case when BranchName = '#BRANCH_NAME#' then 1 else 0 end) "#BRANCH_NAME#"!', '#BRANCH_NAME#', BranchName) , ','||chr(10)) within group (order by BranchName)||chr(10)|| --The FROM: 'from branch_data' v_sql from ( --Distinct BranchNames. select distinct BranchName from branch_data ) ]' ));