Ik denk dat het mogelijk is, hoewel behoorlijk ingewikkeld, om een gepipelinede tabelfunctie die een variabele structuur retourneert . Uw pijplijntabelfunctie gebruikt de Oracle Data Cartridge-interface en de magie van het AnyDataSet-type om tijdens runtime een dynamische structuur te retourneren. U kunt dat vervolgens in volgende SQL-instructies gebruiken alsof het een tabel is, d.w.z.
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Nog een paar referenties die dezelfde voorbeeldimplementatie bespreken
- Dynamische SQL Pivoting
- De Implementatie van de interface-aanpak sectie van de Oracle Data Cartridge Developer's Guide
-
Methode4. Na het downloaden en installeren van de open source PL/SQL-code, is hier een volledige implementatie:
--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 ) ]' ));