参考主题,我创建了一个sql来获取user_tab_table上的公共字段:
select SUBSTR (SYS_CONNECT_BY_PATH (COLUMN_NAME , ','), 2) into str
from (select COLUMN_NAME , ROW_NUMBER () over (order by COLUMN_NAME ) RN,
COUNT (*) OVER () cnt
from USER_TAB_COLUMNS
where TABLE_NAME in( 'tb1','tb2')
group by COLUMN_NAME
having COUNT(*) >= 2
)
WHERE rn = cnt
start with RN = 1
connect by RN = prior RN + 1;
所以我得到了列字符串,但在那之后,我不知道在这个sql上应用(或组合):
select {result}
from tb1
order by filed2;
union
select {result}
from tb2
order by filed1;
有人可以给我一些提示吗?请求帮助...
答案 0 :(得分:0)
以下是如何编写PL / SQL函数来获取查询的光标,从中选择tb1和tb2中的公共列。
create or replace function get_common_columns
return sys_refcursor
as
v_str varchar2(10000);
v_sql varchar2(10000);
v_cursor sys_refcursor;
begin
select listagg(column_name, ',') within group(order by column_name)
into v_str
from
(
select column_name
from user_tab_columns
where table_name in ('tb1', 'tb2')
group by column_name
having count(*) >= 2
);
v_sql := 'select ' || v_str || ' from tb1 ' ||
'union ' ||
'select ' || v_str || ' from tb2 ' ||
'order by ' || v_str;
open v_cursor for v_sql;
return v_cursor;
end get_common_columns;
只是,你想对结果做什么?遗憾的是,您无法从SQL访问它(例如select * from table(get_common_columns)
不起作用)。你只能在PL / SQL中使用它。即使这样也会变得很难,因为你通常需要知道refcursor中的内容(即哪些列)才能使用它。
说完这些之后,你可能想用一些完全不同的方法实现你的想法。