Sql 如何动态地将列名传递给查询?

Sql 如何动态地将列名传递给查询?,sql,oracle,select,plsql,dynamic-sql,Sql,Oracle,Select,Plsql,Dynamic Sql,下面是我的问题和期望的解决方案 问题1: Select colnames from table1; Query1 Result: col1 col2 col3 col4 问题2: Select a1.* from table2 a1; -- should translate to select a1.col1, a1.col2, a1.col3, a1.col4 from table2 a1; 我的第一个查询将给出列名列表,我需要在第二个查询中将。*替换为这些列名。如何实现

下面是我的问题和期望的解决方案

问题1:

Select colnames from table1;

Query1 Result:
 col1
 col2
 col3
 col4
问题2:

Select a1.* 
  from table2 a1;

-- should translate to
select a1.col1, a1.col2, a1.col3, a1.col4 from table2 a1;

我的第一个查询将给出列名列表,我需要在第二个查询中将。*替换为这些列名。如何实现这一点?

您正在寻找动态SQL。其思想是从SQL查询的结果生成查询字符串。然后,您可以使用
executeimmediate
运行它

在您的用例中,这看起来像:

declare
    p_sql varchar2(100);
begin
    select 
        'select ' 
        || listagg('a1.' || colnames, ', ') within group(order by colnames)
        || ' from table2 a1'
    into p_sql
    from table1;

    dbms_output.put_line('sql: ' || p_sql);  -- debug
    execute immediate p_sql;                 -- execute
end;
/
对于示例数据,

dbms_output:
sql: select a1.col1, a1.col2, a1.col3, a1.col4 from table2 a1

这有用吗?你到底想在这里干什么?SQL自动扩展
*
以包含每一列,为什么需要将其转换为不同的查询?您是否正在尝试构建类似于
DBMS\u实用程序的东西。展开\u SQL\u TEXT
,如果是,为什么?