Oracle
 sql >> Database >  >> RDS >> Oracle

colonne dinamiche in Oracle usando sql

Penso che sia possibile, anche se piuttosto complicato, scrivere un funzione di tabella pipeline che restituisce una struttura variabile . La funzione della tabella della pipeline utilizzerà l'interfaccia Oracle Data Cartridge e la magia del tipo AnyDataSet per restituire una struttura dinamica in fase di esecuzione. Puoi quindi usarlo nelle istruzioni SQL successive come se fosse una tabella, ad es.

SELECT *
  FROM TABLE( your_pipelined_function( p_1, p_2 ));

Un altro paio di riferimenti che discutono della stessa implementazione di esempio

  • Pivoting SQL dinamico
  • Il Implementazione dell'approccio all'interfaccia sezione della Oracle Data Cartridge Developer's Guide
  • Metodo4. Dopo aver scaricato e installato il codice PL/SQL open source, ecco un'implementazione 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
            )
        ]'
    ));