sql - 使用变量作为表名并传递给另一个 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;
感谢您的帮助。
解决方案
鉴于您在评论部分表达的内容,最简单的问题解决方案是使用 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 或更高版本)。
推荐阅读
- java - 带有圆角的 Android 图像背景
- python - 仅输出有效
- javascript - Laravel 6 使用 Axios 通过 vuejs-clipper 上传图片
- scala - Spark收集有限排序列表
- regex - PowerShell 中的正则表达式返回比必要更多的信息
- rest - Forge API 响应限制:为什么?
- python - 结果显示 \n 而不是 Python 中的实际换行
- node.js - 如何让 formik 编译?
- python - Django 使用 ModelMultipleChoiceField 保存 ManyToManyField 模型
- php - PHPMAILER 将电子邮件配置分离到不同的功能中