Oracle - анонимная процедура для обхода нескольких таблиц (динамически) - запрос, возвращающий несколько строк - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно запустить один и тот же запрос для нескольких таблиц. Запрос может вернуть ноль, одну или несколько строк.

Я могу перебирать таблицы, используя EXECUTE IMMEDIATE, но для возврата нескольких строк мне понадобится тип данных, поэтому я думаю, что мне нужно сохранить его как CURSOR.

для простоты, скажем, мне нужно выполнить приведенный ниже запрос для 2 таблиц - table1 and table2

Таблица1 имеет следующие столбцы

datetime
device_name
value1
value2

Таблица2 имеет следующие столбцы

datetime
device_name
value3
value4

Запрос для выполнения на обеих таблицах, как показано ниже:

select datetime, count(*) from table_name group by datetime;

Какой здесь лучший подход?

обратите внимание, что я не могу создавать объекты БД (proc / function). Должен быть только анонимным блоком.

1 Ответ

0 голосов
/ 04 сентября 2018

Пока структуры курсоров одинаковы, вы можете перебирать их с помощью некоторых динамических курсоров, например

SQL> set serverout on
SQL> declare
  2    tablist sys.odcivarchar2list :=
  3      sys.odcivarchar2list('ALL_OBJECTS','USER_OBJECTS');
  4    rc sys_refcursor;
  5
  6    date_results sys.odcidatelist := sys.odcidatelist();
  7    count_results sys.odcinumberlist := sys.odcinumberlist();
  8  begin
  9    for i in 1 .. tablist.count
 10    loop
 11      open rc for
 12        replace(q'{select trunc(created,'YYYY'), count(*) from @@@ group by trunc(created,'YYYY') order by 1}', '@@@',tablist(i));
 13      fetch rc bulk collect into date_results, count_results;
 14      close rc;
 15
 16      dbms_output.put_line(tablist(i));
 17      for c in 1 .. date_results.count
 18      loop
 19        dbms_output.put_line(rpad(date_results(c),20)||lpad(count_results(c),20));
 20      end loop;
 21    end loop;
 22  end;
 23  /
ALL_OBJECTS
01-JAN-17                          67892
01-JAN-18                           6228
USER_OBJECTS
01-JAN-18                           1093

PL/SQL procedure successfully completed.
...