Oracle
 sql >> Base de données >  >> RDS >> Oracle

colonnes dynamiques dans oracle en utilisant sql

Je pense qu'il est possible, quoique assez compliqué, d'écrire un fonction de table en pipeline qui renvoie une structure variable . Votre fonction de table de pipeline utilisera l'interface Oracle Data Cartridge et la magie du type AnyDataSet pour renvoyer une structure dynamique lors de l'exécution. Vous pouvez ensuite l'utiliser dans les instructions SQL suivantes comme s'il s'agissait d'une table, c'est-à-dire

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

Quelques références supplémentaires qui traitent du même exemple d'implémentation

  • Pivot SQL dynamique
  • La Mise en œuvre de l'approche d'interface section du Guide du développeur Oracle Data Cartridge
  • Méthode 4. Après avoir téléchargé et installé le code PL/SQL open source, voici une implémentation complète :

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