I need to fetch columns from a master table and the list of columns that i need to get will be in a metadata table for different users.This would need to be dynamic as each user might not have the same number of columns to be fetched.
Metadata table
User short_desc rk sector rk Industry pa sector pa Industry pa Subindustry
Master Data table
ID sector Industry Subindustry 594918104 Technology Information Technology CyberSecurity G0464B107 Financial Services Financials Banks
When user rk is selected from meta table ,i would want to get only sector and industry When user pa is selected i would want to get only sector ,industry and subindustry field also.
Tried this from one more solution,but this is not dynamic.
SELECT t2.user_id,
       t1.attr_name,
       CASE
          WHEN t1.attr_path = 'str1' THEN t2.str1
          WHEN t1.attr_path = 'str2' THEN t2.str2
       END
          col_sel
  FROM metadata t1 INNER JOIN class t2 ON t1.org_id = t2.org_id
 WHERE t1.org_id = 1
When user rk is selected from meta table ,i would want to get only sector and industry When user pa is selected i would want to get only sector ,industry and subindustry field also.
Advertisement
Answer
One option is to use a function that returns ref cursor.
Test case:
SQL> select * from metadata; C_ SHORT_DESC -- -------------------- rk sector rk industry pa industry pa sector pa subindustry SQL> select * from master_data; ID SECTOR INDUSTRY SUBINDUSTRY ---------- --------------- -------------------- --------------- 5949 technology information tech cyber security g046 financial financials banks
Function:
SQL> create or replace function f_meta (par_user in varchar2) 2 return sys_refcursor 3 is 4 l_str varchar2(200); 5 rc sys_refcursor; 6 begin 7 select listagg(short_desc, ', ') within group (order by null) 8 into l_str 9 from metadata 10 where c_user = par_user; 11 12 l_str := 'select ' || l_str ||' from master_data'; 13 14 open rc for l_str; 15 return rc; 16 end; 17 / Function created.
Testing:
SQL> select f_meta('rk') from dual;
F_META('RK')
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
INDUSTRY             SECTOR
-------------------- ---------------
information tech     technology
financials           financial
SQL> select f_meta('pa') from dual;
F_META('PA')
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
INDUSTRY             SECTOR          SUBINDUSTRY
-------------------- --------------- ---------------
information tech     technology      cyber security
financials           financial       banks
SQL>