如何通过 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 中的内容(即哪些列)才能使用它。

话虽如此,您可能想通过一些完全不同的方法来实现您的想法。