繁体   English   中英

PL SQL-动态定义全局游标

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM