Acho que é possível, embora bastante complicado, escrever um função de tabela em pipeline que retorna uma estrutura de variável . Sua função de tabela de pipeline usará a interface Oracle Data Cartridge e a mágica do tipo AnyDataSet para retornar uma estrutura dinâmica em tempo de execução. Você pode usar isso em instruções SQL subsequentes como se fosse uma tabela, ou seja,
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Mais algumas referências que discutem a mesma implementação de exemplo
- Dinâmica SQL Pivoting
- A Implementação da abordagem de interface seção do Guia do desenvolvedor do Oracle Data Cartridge
-
Método 4. Após baixar e instalar o código PL/SQL de código aberto, aqui está uma implementação 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 ) ]' ));