我有这样的查询:
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。我需要使用变量。我目前正在这样做,因为我需要逐行处理数据。
任何想法如何做到这一点?
感谢。 罗恩
答案 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#
如果光标为空,则不需要事先计算行数。立即退出循环。