使用变量作为表名并传递给另一个 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 视图作为变量传递给另一个视图结构