[英]PL SQL - Define Dynamically Global Cursor
程序包顶部有两个光标
cursor cur1()
select 1 from dual;
cursor cur2()
select 2 from dual;
我有如下循环,我尝试动态设置cur1或cur2。
for row1 in cur1 -- or cur2
..
end loop;
或者我可以动态生成顶部的全局游标吗?
Oracle提供了ref游标构造,以允许我们动态定义游标。 不幸的是,我们不能在FOR LOOP中使用ref游标,因此我们需要输入更多代码。
declare
rc sys_refcursor;
switch varchar2(10) := 'iOS';
lrec t23%rowtype; -- or define a RECORD type to match the required projection
begin
-- in real life SWITCH would be a passed parameter
if switch = 'iOS' then
open rc for select * from t23;
else
open rc for select * from t42;
end if;
loop
fetch rc into lrec;
exit when rc%notfound;
dbms_output.put_line(lrec.id ||'::'||lrec.text);
end loop;
end;
/
查看SQL Fiddle演示 。
假设两个游标的结果集是相同的列和数据类型,则可以执行以下操作:
cursor cur(p_flag varchar2) is
select 1 as value from dual
where p_flag = 'iOS'
union
select 2 as value from dual
where p_flag = 'Android';
接着
for row1 in cur('iOS')
...
end loop;
要么
for row1 in cur('Android')
...
end loop;
在此,iOS / Android标志实际上是变量而不是文字。
游标并集的每个分支中的标志检查使该分支不返回任何行。 希望优化器能够立即发现并短路,因此它实际上不会在无效分支中做任何实际工作。
快速演示:
declare
cursor cur(p_flag varchar2) is
select 1 as value from dual
where p_flag = 'iOS'
union
select 2 from dual
where p_flag = 'Android';
l_flag varchar2(7);
begin
l_flag := 'Android';
for r in cur(l_flag) loop
dbms_output.put_line('Cursor got: ' || r.value);
end loop;
end;
/
Cursor got: 2
PL/SQL procedure successfully completed.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.