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

时间:2019-02-04 16:28:26

标签: oracle plsql

我在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的表名上运行选择查询,将会很有帮助

2 个答案:

答案 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;
    /