我在Oracle DB中具有如下表:abc20190101,abc20190102等。每个都有相同的列数据类型和相同的列数,只是填充了不同的数据。 我有一个调度程序,每天在特定时间在这些表上运行查询。 但是表名应附加sysdate。实际上,我只需要对abc20190101,xyz20190101之类的2个表执行选择和联接操作
我尝试过这个:
select * from (select concat('abc',(SELECT to_char(sysdate-1,'yyyymmdd') from dual)) as "Table" from dual) ;
但这只是返回表名作为输出,而不是表中的数据值。
我也尝试了以下PL / SQL过程:
declare
tabname varchar(32);
begin
tabname := 'abc'|| TO_CHAR(SYSDATE, 'YYYYMMDD');
execute immediate 'select * from '|| tabname ;
end;
但这会产生语法错误。由于我是PL / SQL存储过程的新手,所以找不到错误所在。如果有人可以告诉您如何在附加了动态sysdate的表名上运行选择查询,将会很有帮助
答案 0 :(得分:2)
尝试动态SQL是正确的方法,但是如果选择,则需要指定要如何返回结果。所以你需要像这样的东西:
declare
tabname varchar(32);
result YOUR_TYPE;
begin
tabname := 'abc'|| TO_CHAR(SYSDATE, 'YYYYMMDD');
execute immediate 'select * from ' || tabname into result;
end;
如果您的查询返回单个结果,这将起作用,因此我想您对此不满意。您可以选择加入收藏集或使用bulk collect
键入可能您想对所选数据进行处理,以便可以返回ref cursor的结果或在loop中迭代的结果
答案 1 :(得分:0)
下面的代码段将解决您的问题。
set SERVEROUTPUT ON;
declare
tabname varchar(32);
query_sql varchar2(300);
result1 varchar2(20);
begin
tabname := 'tab_'|| TO_CHAR(SYSDATE, 'YYYYMMDD'); -- use your table and date
query_sql := 'select account_name from '|| tabname; --modify query as per your requirement
execute immediate query_sql into result1;
dbms_output.put_line(result1);
exception
when others then
dbms_output.put_line(sqlerrm);
end;
/