【问题标题】:How to dynamically pass column names to a query?如何动态地将列名传递给查询?
【发布时间】:2020-08-04 13:44:08
【问题描述】:

以下是我的问题和想要的解决方案。

查询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 自动扩展.* 以包含每一列,为什么需要将其转换为不同的查询?您是否尝试构建类似DBMS_UTILITY.EXPAND_SQL_TEXT 的东西,如果是,为什么?

标签: sql oracle select plsql dynamic-sql


【解决方案1】:

您正在寻找动态 SQL。这个想法是从 SQL 查询的结果中生成查询字符串。然后您可以使用execute immediate 运行它。

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

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;
/

对于您的示例数据,this generates

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多