根据表名称选择查询列名称

时间:2019-12-27 01:10:32

标签: oracle select dynamic

我有成千上万个表,每个表都有自己的唯一键列。我想在单个查询中基于表名称选择键。如果有帮助,它总是表中的第二列。

我想要类似的东西

    select c_name from t_name
    where c_name (is)
    (
    select column_name as c_name
    from Dba_tab_Columns 
    where table_name = t_name 
    and column_name like '%name' --->>>(((or column_id =2)))
    )

我知道t_name,但是我需要一个查询才能根据table_name选择列名。

因此,如果我说select c_name from Animals,它应该给我所有动物的清单,如果我说select c_name from Cars,它应该给我一个小汽车清单。

1 个答案:

答案 0 :(得分:0)

您不能在纯SQL中执行此操作,您将需要一个表函数。这是一种方法:

create or replace type tvc as table of varchar2(128);
/


create or replace function return_col (tname user_tables.table_name%type) return tvc pipelined
as
c_statement varchar2(400);
get_data    sys_refcursor;
out_d       varchar2(128);
begin
    for gettnames_and_cols in (select  c.column_name
        from user_cons_columns c, user_constraints uc
        where constraint_type in ('P','U') and uc.table_name=c.table_name and c.table_name=upper(tname)) loop
            c_statement:='select '||gettnames_and_cols.column_name||' as output_col from '||tname;
            open get_data for c_statement;
            while true loop
                fetch get_data into out_d;
                exit when get_data%notfound;
                pipe row(out_d);
            end loop;
            close get_data;
    end loop;
    return;
end;
/

事情是,这仅给出了数据,而不知道列名是什么或数据来自哪个表。您可以修改PL / SQL代码以添加此信息。此外,这还假定数据将以VARCHAR2(128)的形式返回,您可能需要根据需要对其进行调整。您可以按以下方式使用此表函数:

select *
from table (return_col('your_table_name'));