如何通过oracle sql中的user_tab_columns选择选择列?

时间:2017-01-19 05:17:57

标签: oracle plsql database-metadata

参考主题,我创建了一个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;

有人可以给我一些提示吗?请求帮助...

1 个答案:

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

说完这些之后,你可能想用一些完全不同的方法实现你的想法。