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>