Tôi nghĩ rằng có thể, mặc dù khá phức tạp, để viết một hàm bảng pipelined trả về cấu trúc biến . Chức năng bảng đường dẫn của bạn sẽ sử dụng giao diện Hộp dữ liệu Oracle và sự kỳ diệu của kiểu AnyDataSet để trả về cấu trúc động trong thời gian chạy. Sau đó, bạn có thể sử dụng nó trong các câu lệnh SQL tiếp theo như thể nó là một bảng, tức là
SELECT *
FROM TABLE( your_pipelined_function( p_1, p_2 ));
Một số tài liệu tham khảo khác thảo luận về việc triển khai cùng một mẫu
- Dynamic SQL Pivoting
- Triển khai Phương pháp Tiếp cận Giao diện phần Hướng dẫn dành cho nhà phát triển hộp mực dữ liệu Oracle
-
Method4. Sau khi tải xuống và cài đặt mã nguồn mở PL / SQL, đây là cách triển khai hoàn chỉnh:
--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 ) ]' ));