sql - Oracle PL SQL : using labels to get out of for loops

标签 sql oracle for-loop plsql label

SET SERVEROUTPUT ON
BEGIN
  <<outer_loop>>
  FOR i IN 1..10 LOOP
    FOR i IN 1..3 LOOP
      EXIT outer_loop WHEN outer_loop.i = 3;
    DBMS_OUTPUT.PUT_LINE('outer i is:' || outer_loop.i || ' inner i is: ' ||i);
      GOTO goodbye;
    END LOOP;       
  END LOOP;
  <<goodbye>>
  NULL;
END;
/

我有上面的代码,它给出了下面的结果,但我的笔记说永远不要这样做。为什么会这样?毕竟它确实有效。

anonymous block completed
outer i is:1 inner i is: 1

最佳答案

GOTO 的使用在几乎所有语言中都是不鼓励的,主要是因为它会损害代码的可读性,是的,在您的情况下甚至更糟 — 您正在跳过两层堆栈。

除此之外,如果您不使用 GOTO,PL/SQL 还具有您会注意到的此功能。它很少有用,但您的代码中的符号正是用于此目的。

比如说,你有两个这样嵌套的循环。

BEGIN
  <<outer>>
  FOR i IN 1..2 LOOP
    <<inner>>
    FOR j IN 1..2 LOOP
      dbms_output.put_line('In inner loop');
    END LOOP;

    dbms_output.put_line('In outer loop');
  END LOOP;

  dbms_output.put_line('Finished');
END;

显然,输出将是

In inner loop
In inner loop
In outer loop
In inner loop
In inner loop
In outer loop
Finished

有时你需要在它“正常”完成之前退出循环,所以你添加EXIT;

BEGIN
  <<outer>>
  FOR i IN 1..2 LOOP
    <<inner>>
    FOR j IN 1..2 LOOP
      dbms_output.put_line('In inner loop');
      EXIT;
    END LOOP;

    dbms_output.put_line('In outer loop');
  END LOOP;

  dbms_output.put_line('Finished');
END;

这导致每次外循环迭代只执行一次嵌套循环。

In inner loop
In outer loop
In inner loop
In outer loop
Finished

但是您可能想要完全中止您的处理,为此您可以在嵌套循环中设置一些标志变量并在外循环中检查它的值,或者您可以指定要退出的确切循环。

BEGIN
  <<outer>>
  FOR i IN 1..2 LOOP
    <<inner>>
    FOR j IN 1..2 LOOP
      dbms_output.put_line('In inner loop');
      EXIT outer;
    END LOOP;

    dbms_output.put_line('In outer loop');
  END LOOP;

  dbms_output.put_line('Finished');
END;

这样你就退出了两个循环。

In inner loop
Finished

回到您的示例,如果您消除 GOTO,您将在内循环的第三次迭代中退出两个循环。

我不会说这对可读性有好处,我宁愿以某种方式通知外循环一些特殊的事情,也不愿让内循环负责从外循环退出。

关于sql - Oracle PL SQL : using labels to get out of for loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34723451/

相关文章:

mysql - 如何检查列 A IN (3,4,5) 和 A NOT IN (1,2)

java - Oracle 数据库 SELECT ... FOR UPDATE 自动提交

batch-file - 批处理如何正确结束 for 循环

python - 打印所有能被 7 整除并包含 7 从 0 到 100 的数字

python - matplotlib imshow 错误的索引

sql - 将比较运算符作为参数传递并直接在 SQL 存储过程中使用

mysql - 错误 Delphi/MySQL/参数

mysql - 优化大表(75M+ 行)上的简单 mysql select

sql - 甲骨文 : Create table in another schema and grant select and insert on it from the same schema

macOS 上的 Python "DPI-1047 Cannot locate dlopen(libclntsh.dylib)"