我正在开发Oracle存储过程。 我需要迭代表的行。我可以使用:
FOR eachrow IN table_name
LOOP
END LOOP;
但我需要table_name是动态的。 例如,表名存储在其他表中。 所以,我可以在该表和循环内部执行FOR循环,我想遍历新表的行。
请建议我如何实现这一目标。
谢谢,
窗扇
答案 0 :(得分:2)
使用FOR eachrow IN table_name LOOP
无法做到这一点,您必须改为使用引用光标:
首先是一些样本数据。这些表有一些共同的列名,在你的内部for循环中你只能访问这些列,这是我在上面的评论中写的。结果类型在内循环中应该相同。
create table froc_a(id number, name varchar2(10), row_added date);
insert into froc_a values (1, '1', sysdate);
insert into froc_a values (2, '2', sysdate - 2);
insert into froc_a values (4, '4', sysdate - 4);
create table froc_b(id number, name2 varchar2(10), row_added date);
insert into froc_b values (1, 'b1', sysdate);
insert into froc_b values (2, 'b2', sysdate - 2);
insert into froc_b values (4, 'b4', sysdate - 4);
create table froc_c(id number, txt varchar2(10), row_added date);
insert into froc_c values (1, 'c1', sysdate);
insert into froc_c values (2, 'c2', sysdate - 2);
insert into froc_c values (4, 'c4', sysdate - 4);
以下是第一种如何编写它的方法:
declare
TYPE curtype IS REF CURSOR;
l_cursor curtype;
l_param_id number;
l_id number;
l_val varchar2(100);
begin
l_param_id := 1;
-- Loop over your table names
for l_rec in (with tabnames(name) as
(select 'froc_a'
from dual
union all
select 'froc_b'
from dual
union all
select 'froc_c'
from dual)
select * from tabnames) loop
dbms_output.put_line(l_rec.name);
-- Open cursor for current table
open l_cursor for 'select id, row_added from ' || l_rec.name || ' where id = :1'
using l_param_id;
-- Loop over rows of current table
loop
fetch l_cursor
into l_id, l_val;
exit when l_cursor%notfound;
dbms_output.put_line(l_id || ', ' || l_val);
end loop;
end loop;
end;
输出:
froc_a
1, 06-APR-16
froc_b
1, 06-APR-16
froc_c
1, 06-APR-16