добавьте дату в строку, чтобы получить имя таблицы в Oracle и выберите запрос по ней - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть следующие таблицы в базе данных Oracle: abc20190101, abc20190102 и т. Д.Каждый из них имеет одинаковый тип данных столбцов и одинаковое количество столбцов, просто заполненных разными данными.У меня есть планировщик для выполнения запроса на эти таблицы каждый день в определенное время.Но к имени таблицы следует добавить sysdate.На самом деле мне нужно выполнить только операции выбора и объединения для 2 таблиц, таких как abc20190101, xyz20190101

Я пробовал это:

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 голосов
/ 14 февраля 2019

Фрагмент кода ниже решит вашу проблему.

        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;
    /
0 голосов
/ 04 февраля 2019

Попытка динамического SQL является правильным способом, но если вы все же выберете, вам нужно указать, как вы хотите возвращать результаты.Так что вам нужно что-то вроде:

declare
  tabname varchar(32);
  result YOUR_TYPE;
begin
  tabname := 'abc'|| TO_CHAR(SYSDATE, 'YYYYMMDD');
  execute immediate 'select * from ' || tabname into result;
end;

Это сработает, если ваш запрос вернет единственный результат, поэтому я думаю, что вы не довольны этим.Вы можете выбрать в коллекцию или ввести с помощью массовый сбор

Возможно, вы хотите что-то сделать с выбранными данными, чтобы можно было возвращать результаты в виде ref cursor или итерациейрезультаты в loop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...