Creo que es posible, aunque bastante complicado, escribir un función de tabla segmentada que devuelve una estructura variable . Su función de tabla de canalización usará la interfaz de cartucho de datos de Oracle y la magia del tipo AnyDataSet para devolver una estructura dinámica en tiempo de ejecución. Luego puede usar eso en declaraciones SQL posteriores como si fuera una tabla, es decir,
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Un par de referencias más que analizan la misma implementación de muestra
- Dynamic SQL Pivoting
- La Implementación del enfoque de interfaz sección de la Guía del desarrollador de Oracle Data Cartridge
-
Método4. Después de descargar e instalar el código PL/SQL de fuente abierta, aquí hay una implementación completa:
--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 ) ]' ));