gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:22:16 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com