非常に複雑ですが、変数構造を返すパイプラインテーブル関数 。パイプラインテーブル関数は、Oracle Data CartridgeインターフェースとAnyDataSetタイプの魔法を使用して、実行時に動的構造を返します。その後、それをテーブルであるかのように後続のSQLステートメントで使用できます。つまり
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
同じサンプル実装について説明している参考資料がさらにいくつかあります
- 動的SQLピボット
- インターフェースアプローチの実装> 『Oracle Data Cartridge Developer's Guide』のセクション
-
Method4。 オープンソースのPL/SQLコードをダウンロードしてインストールした後、完全な実装を次に示します。
--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 ) ]' ));