sql >> Databasteknik >  >> RDS >> Oracle

dynamiska kolumner i oracle med sql

Jag tror att det är möjligt, även om det är ganska komplicerat, att skriva en pipelined tabellfunktion som returnerar en variabel struktur . Din pipeline-tabellfunktion kommer att använda Oracle Data Cartridge-gränssnittet och magin i AnyDataSet-typen för att returnera en dynamisk struktur vid körning. Du kan sedan använda det i efterföljande SQL-satser som om det vore en tabell, dvs.

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

Ytterligare ett par referenser som diskuterar samma exempelimplementering

  • Dynamisk SQL-pivotering
  • Implementera gränssnittsmetoden avsnittet i Oracle Data Cartridge Developer's Guide
  • Metod4. Efter att ha laddat ner och installerat PL/SQL-koden med öppen källkod, här är en komplett implementering:

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


  1. kan inte hitta symbolen PreparedStatement efter JAR-uppgradering

  2. Hexadecimalt värde 0x00 är ett ogiltigt tecken

  3. Hur man uppdaterar en MySql DB med Flex

  4. Hur man ändrar prioritet för samtidiga program