Ich denke, es ist möglich, wenn auch ziemlich kompliziert, einen Pipeline-Tabellenfunktion, die eine Variablenstruktur zurückgibt . Ihre Pipeline-Tabellenfunktion verwendet die Oracle Data Cartridge-Schnittstelle und die Magie des AnyDataSet-Typs, um zur Laufzeit eine dynamische Struktur zurückzugeben. Sie können das dann in nachfolgenden SQL-Anweisungen verwenden, als wäre es eine Tabelle, d. h.
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Ein paar weitere Referenzen, die dieselbe Beispielimplementierung behandeln
- Dynamisches SQL-Pivoting
- Die Implementierung des Schnittstellenansatzes Abschnitt des Oracle Data Cartridge Developer's Guide
-
Methode4. Nach dem Herunterladen und Installieren des Open-Source-PL/SQL-Codes finden Sie hier eine vollständige Implementierung:
--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 ) ]' ));