Oracle DB SQL过程使用动态表bame迭代表

时间:2016-04-06 05:55:45

标签: sql database oracle

我正在开发Oracle存储过程。 我需要迭代表的行。我可以使用:

FOR eachrow IN table_name
LOOP
END LOOP;

但我需要table_name是动态的。 例如,表名存储在其他表中。 所以,我可以在该表和循环内部执行FOR循环,我想遍历新表的行。

请建议我如何实现这一目标。

谢谢,
窗扇

1 个答案:

答案 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