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