Penso che sia possibile, anche se piuttosto complicato, scrivere un funzione di tabella pipeline che restituisce una struttura variabile . La funzione della tabella della pipeline utilizzerà l'interfaccia Oracle Data Cartridge e la magia del tipo AnyDataSet per restituire una struttura dinamica in fase di esecuzione. Puoi quindi usarlo nelle istruzioni SQL successive come se fosse una tabella, ad es.
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Un altro paio di riferimenti che discutono della stessa implementazione di esempio
- Pivoting SQL dinamico
- Il Implementazione dell'approccio all'interfaccia sezione della Oracle Data Cartridge Developer's Guide
-
Metodo4. Dopo aver scaricato e installato il codice PL/SQL open source, ecco un'implementazione completa:
--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 ) ]' ));