如何在oracle pl / sql中将表名用作嵌套for循环中的变量?

时间:2014-01-15 10:55:15

标签: sql oracle variables for-loop

我有这样的查询:

 v_sql:= 'select count(1) from '||v_tbl||' where col1 = ' || month_var || ' and ds =''T''';
 execute immediate v_sql into v_row_cnt;

   for j in 1..v_row_cnt
    loop
      for i in (select b.* from
               (select a.*, rownum as rn
                from (select * from MY_TABLE where col1 = month_var and DS = 'T') a
                 ) b
               where rn=j)
      loop

          do_something;
      end loop;
     end loop;

现在,我的问题是,我不能在这里硬编码MY_TABLE。我需要使用变量。我目前正在这样做,因为我需要逐行处理数据。

任何想法如何做到这一点?

感谢。 罗恩

1 个答案:

答案 0 :(得分:2)

您可以使用dynamic SQL来构建游标。

这里的逻辑效率很低:首先计算给定表中的行数,然后为每一行执行一次相同的查询(另一个Schlemiel the Painter's algorithm示例)。

您不需要这样做,只需循环光标,这将只执行一次查询。例如:

SQL> DECLARE
  2     l_cursor SYS_REFCURSOR;
  3     l_table VARCHAR2(32) := 'ALL_OBJECTS';
  4     l_name VARCHAR2(32);
  5  BEGIN
  6     OPEN l_cursor FOR 'SELECT object_name
  7                          FROM ' || l_table
  8                    || ' WHERE rownum <= 5 ';
  9     LOOP
 10        FETCH l_cursor INTO l_name;
 11        EXIT WHEN l_cursor%NOTFOUND;
 12        -- do_something
 13        dbms_output.put_line(l_name);
 14     END LOOP;
 15     CLOSE l_cursor;
 16  END;
 17  /

C_OBJ#
I_OBJ#
TAB$
CLU$
C_TS#

如果光标为空,则不需要事先计算行数。立即退出循环。