cursor_loop
正如其他人已经说过的那样,由于范围的原因,您不能直接在动态 SQL 中引用。如果您坚持使用这种模式,那么您可以使用绑定变量标志将状态信息从动态代码传递回静态代码;就像是:
DECLARE
break_loop pls_integer;
...
break_loop := 0;
<<cursor_loop>>
LOOP
fetch c1 into somerecord;
EXECUTE IMMEDIATE 'begin if 1 = 1 then :break_loop := 1; end if; end;'
USING OUT break_loop;
EXIT cursor_loop WHEN break_loop = 1;
END LOOP cursor_loop;
...
稍微更完整一些,但显然仍然非常做作,例如:
DECLARE
break_loop pls_integer;
somevar number;
c1 sys_refcursor;
BEGIN
OPEN c1 FOR
select 1 from dual
union all select 2 from dual
union all select 3 from dual;
break_loop := 0;
dbms_output.put_line('before loop, break_loop is ' || break_loop);
<<cursor_loop>>
LOOP
fetch c1 into somevar;
exit when c1%notfound;
dbms_output.put_line('got ' || somevar);
EXECUTE IMMEDIATE 'begin if :somevar = 2 then :break_loop := 1; end if; end;'
USING somevar, OUT break_loop;
EXIT cursor_loop WHEN break_loop = 1;
END LOOP cursor_loop;
dbms_output.put_line('after loop, break_loop is ' || break_loop);
END;
/
PL/SQL procedure successfully completed.
before loop, break_loop is 0
got 1
got 2
after loop, break_loop is 1
由于动态检查,在获取值“3”之前退出循环。