Sql 如何动态地将列名传递给查询?
下面是我的问题和期望的解决方案 问题1: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; 我的第一个查询将给出列名列表,我需要在第二个查询中将。*替换为这些列名。如何实现
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
,如果是,为什么?