sql >> Databáze >  >> RDS >> Oracle

dynamické sloupce v oracle pomocí sql

Myslím, že je možné, i když je to docela komplikované, napsat funkce zřetězené tabulky, která vrací proměnnou strukturu . Vaše funkce tabulky kanálu použije rozhraní Oracle Data Cartridge a kouzlo typu AnyDataSet k vrácení dynamické struktury za běhu. To pak můžete použít v následujících příkazech SQL, jako by to byla tabulka, tj.

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

Několik dalších odkazů, které pojednávají o stejné ukázkové implementaci

  • Dynamické pivotování SQL
  • Implementace přístupu rozhraní části příručky Oracle Data Cartridge Developer's Guide
  • Metoda 4. Po stažení a instalaci open source PL/SQL kódu je zde kompletní implementace:

    --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. Počítání všech příspěvků patřících do kategorie A jejích podkategorií

  2. Západka FGCB_ADD_REMOVE

  3. Modelování kolejnic:převod HABTM na has_many :through

  4. Jsou tabulky vytvořeny pomocí CREATE TEMPORARY TABLE v paměti nebo na disku?