Oracle - 循环遍历多个表的匿名过程(动态) - 查询返回多行
Oracle - Anonymous Procedure to loop through multiple tables (dynamically) - Query returning multiple rows
我需要在多个表上触发相同的查询。查询可能 return 零、一或多个行。
我可以使用 EXECUTE IMMEDIATE
遍历表,但是对于 return 多行我需要一个数据类型,所以我想我需要将它保持为 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)。只能是匿名块。
只要游标结构相同,就可以循环使用一些动态引用游标,例如
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.
我需要在多个表上触发相同的查询。查询可能 return 零、一或多个行。
我可以使用 EXECUTE IMMEDIATE
遍历表,但是对于 return 多行我需要一个数据类型,所以我想我需要将它保持为 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)。只能是匿名块。
只要游标结构相同,就可以循环使用一些动态引用游标,例如
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.