Oracle - 匿名过程循环遍历多个表(动态) - 查询返回多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle - 匿名过程循环遍历多个表(动态) - 查询返回多行相关的知识,希望对你有一定的参考价值。

我需要在多个表上触发相同的查询。查询可能返回零,一行或多行。

我可以使用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)。必须只是匿名阻止。

答案

只要游标结构相同,您就可以使用一些动态ref游标进行循环,例如

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.

以上是关于Oracle - 匿名过程循环遍历多个表(动态) - 查询返回多行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle动态游标实现动态SQL循环遍历,和静态游标的比较。

动态 SQL Server 查询循环遍历架构查找主键重复

Oracle PL/SQL - 循环值作为没有动态 SQL 的动态列名

oracle存储过程匿名块函数包

如何遍历一组动态表单输入并将它们插入到多个表中?

Netezza 存储过程错误