Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamische Spalten in Oracle mit SQL

Ich denke, es ist möglich, wenn auch ziemlich kompliziert, einen Pipeline-Tabellenfunktion, die eine Variablenstruktur zurückgibt . Ihre Pipeline-Tabellenfunktion verwendet die Oracle Data Cartridge-Schnittstelle und die Magie des AnyDataSet-Typs, um zur Laufzeit eine dynamische Struktur zurückzugeben. Sie können das dann in nachfolgenden SQL-Anweisungen verwenden, als wäre es eine Tabelle, d. h.

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

Ein paar weitere Referenzen, die dieselbe Beispielimplementierung behandeln

  • Dynamisches SQL-Pivoting
  • Die Implementierung des Schnittstellenansatzes Abschnitt des Oracle Data Cartridge Developer's Guide
  • Methode4. Nach dem Herunterladen und Installieren des Open-Source-PL/SQL-Codes finden Sie hier eine vollständige Implementierung:

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