Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

colunas dinâmicas no oracle usando sql


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
            )
        ]'
    ));