首页 > 解决方案 > 使用变量作为表名并传递给另一个 sql 查询

问题描述

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

我将使用 oracle table 作为示例,以便可以轻松解释。

我想做的事...

查询 all_table 如下: QueryA:

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;

感谢您的帮助。

标签: sqloraclevariablesoracle-sqldeveloper

解决方案


鉴于您在评论部分表达的内容,最简单的问题解决方案是使用 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 或更高版本)。

多态表函数


推荐阅读