使用变量作为表名并传递给另一个 sql 查询 [重复]

Posted

技术标签:

【中文标题】使用变量作为表名并传递给另一个 sql 查询 [重复]【英文标题】:Using variable as table name and pass into another sql query [duplicate] 【发布时间】:2020-09-14 23:23:35 【问题描述】:

无需详述 - 我们用于性能测试的工具,它会吐出几个表(每次新运行都会更改名称),其中包含不同类型的数据。一个表包含所有表名和数据类型的列表。

我将使用 oracle 表作为示例,以便于解释。

我想做的事……

查询 all_table 如下: 查询A:

select table_name from all_tables where table_name like 'HZ_CUST_%'

    Result will say: Table_name = 'HZ_CUST_ACCOUNTS'

使用 QueryA 结果进行查询,例如:

Select * from [QUERYA_RESULT] WHERE creation_date > sysdate, account_number between '500000' and '599999'

我得到了类似的东西,但不太确定该怎么做。

declare  variable TABLE_NAME CHAR(10);
SELECT TABLE_NAME into :V_NAME from all_tables WHERE TABLE_NAME LIKE 'HZ_CUST_ACCOUNTS';
select *
  from :V_NAME;

感谢您的帮助。

【问题讨论】:

参数不能用于表名和列名。您唯一的选择是动态 SQL - 使用 execute immediate 对不起,我不熟悉动态 sql,我该怎么做呢? 你打算如何处理select * from :v_name 的结果?如果您只是要在SQL*Plus 脚本中将其打印出来,您可以使用动态 SQL 打开一个游标,然后打印该游标。但是,如果您真的打算对结果做某事,则方法需要改变 您可以使用多态表函数 (PTF)。官方文档和 livesql.oracle.com 上有很多示例。另一种选择:使用 xmltable 或 dbms_xmlgen。如果你愿意,我明天可以提供示例 @SayanMalakshinov 那太好了!如果我能举个例子。谢谢! 【参考方案1】:

鉴于您在评论部分表达的内容,解决问题的最简单方法是使用 DYNAMIC SQL

declare
v_table_name varchar2(130);
v_sql        clob;
begin
   -- get the table name
   select table_name into v_table_name from all_tables where table_name like 'HZ_CUST_%' ;
   -- Build dynamic statement
   v_sql := ' select * from '||v_table_name||' where creation_date > sysdate 
              and account_number between ''500000'' and ''599999'' ';
   execute immediate v_sql;
end;
/

从这个小版本开始,您可以将此代码扩展为您需要做的任何事情,特别是输出。当然,这取决于你需要用它做什么。例如,我可以根据同一个句子存储字段的最大值。

declare
v_table_name varchar2(130);
v_sql        clob;
vmaxvalue     pls_integer;
begin
   -- get the table name
   select table_name into v_table_name from all_tables where table_name like 'HZ_CUST_%' ;
   -- Build dynamic statement
   v_sql := ' select max(table_field) from '||v_table_name||' where creation_date > sysdate 
              and account_number between ''500000'' and ''599999'' ';
   execute immediate v_sql into vmaxvalue;
end;
/

我认为您的案例不需要使用旨在发展管道功能概念的 PTF(多态表函数)。但是,正如您很好地解释了您打算如何处理查询结果,您可能想看看它们。查看这个非常好的 PTF 示例(记住 Oracle 18c 或更高版本)。

Polymorphic Table Functions

【讨论】:

以上是关于使用变量作为表名并传递给另一个 sql 查询 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

spring data rest hibernate 是小写所有表名并忽略 @Table("Name")

[mysql-connector-python在将表作为参数传递时,在表名周围添加单引号。表名来自Flask会话变量

如何将一个 SwiftUI 视图作为变量传递给另一个视图结构

将日期附加到字符串以在 oracle 中获取表名并对其进行选择查询

在sql语句中,怎样将参数做为表名传递到查询语句中

Mysql 只输出最后循环数据