如何通过 user_tab_columns selection 在 oracle sql 中 select 列?
how to select a column by user_tab_columns selection in oracle sql?
参考主题,我已经创建了一个 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;
有人可以给我一些提示吗?感谢您的帮助...
这里是如何编写一个 PL/SQL 函数来为您 select 来自 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 中的内容(即哪些列)才能使用它。
话虽如此,您可能想通过一些完全不同的方法来实现您的想法。
参考主题,我已经创建了一个 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;
有人可以给我一些提示吗?感谢您的帮助...
这里是如何编写一个 PL/SQL 函数来为您 select 来自 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 中的内容(即哪些列)才能使用它。
话虽如此,您可能想通过一些完全不同的方法来实现您的想法。