根据用户输入,我的程序需要打开不同的光标但执行相同的操作。由于游标将从不同的表中获取数据,因此我无法将查询合并为一个,或使用参数化游标。无论如何我们可以在不使用refcursor的情况下执行以下操作吗?
DECLARE
p_cond NUMBER;
CURSOR c1 IS
SELECT 'a' txt FROM dual; -- table A
CURSOR c2 IS
SELECT 'b' txt FROM dual; -- table B
BEGIN
p_cond := 1;
FOR tmp IN decode(p_cond, 1, c1, c2) loop -- this of course doesn't work
dbms_output.put_line(tmp.txt);
END loop;
END;
/
谢谢!
答案 0 :(得分:0)
我假设您的select查询将始终返回具有相同结构的记录集,无论它是从表A还是表B中选择。如果是这种情况,使用ref游标将会很有帮助。
如果您的选择查询也可能返回结构上不同的记录集,那么 你将不得不使用dbms_sql。
create table a (x varchar2(20)) ;
create table b (x varchar2(20)) ;
insert into a values('A') ;
insert into b values('B') ;
DECLARE
p_cond NUMBER;
Type cur is ref cursor return a%rowtype;
c cur ;
var c%rowtype ;
BEGIN
p_cond := 0;
If p_cond = 1 then
Open c for SELECT 'a' FROM dual;
else
Open c for SELECT 'b' FROM dual;
end if ;
loop
fetch c into var ;
exit when c%notfound ;
dbms_output.put_line(var.x) ;
end loop;
END;