Oracle
 sql >> Baza danych >  >> RDS >> Oracle

dynamiczne kolumny w Oracle przy użyciu sql

Myślę, że jest możliwe, choć dość skomplikowane, napisanie funkcja tabeli potokowej, która zwraca strukturę zmiennej . Twoja funkcja tabeli potoku użyje interfejsu Oracle Data Cartridge i magii typu AnyDataSet, aby zwrócić dynamiczną strukturę w czasie wykonywania. Możesz użyć tego w kolejnych instrukcjach SQL tak, jakby była to tabela, tj.

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

Jeszcze kilka referencji, które omawiają tę samą przykładową implementację

  • Dynamiczne przestawianie SQL
  • Implementacja podejścia interfejsowego sekcji Przewodnika programisty kasety danych Oracle
  • Metoda4. Po pobraniu i zainstalowaniu kodu PL/SQL typu open source, oto pełna implementacja:

    --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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykonanie zapytania Oracle Ad Hoc z błędem parametrów powiązania; ORA-00907:brak prawego nawiasu

  2. Powolna migracja do chmury

  3. Globalne tabele temp — SQL Server vs Oracle

  4. Oracle Naturalne łączenia i liczenie(1)

  5. Lepsze zarządzanie pamięcią (stertą) w systemie Solaris 10