oracle服务器中的嵌套循环

Nested Loops in oracle server

我不是软件程序员。我想为我的工作学习 PL/SQL。我检查了一个匿名过程,包括如下所示的嵌套基本循环。由于这个匿名块被发现“166”。我无法理解如何在以下语句中迭代 for 循环。有人可以帮我解决这个问题吗?如果你能帮助我解决这个问题,我将不胜感激。

DECLARE
s PLS_INTEGER := 0;
i PLS_INTEGER := 0;
j PLS_INTEGER;
BEGIN
<<outer_loop>>
LOOP
i := i + 1;
j := 0;
<<inner_loop>>
LOOP
j := j + 1;
s := s + i * j; -- Sum several products
EXIT inner_loop WHEN (j > 5);
EXIT outer_loop WHEN ((i * j) > 15);
END LOOP inner_loop;
END LOOP outer_loop;
DBMS_OUTPUT.PUT_LINE
('The sum of products equals: ' || TO_CHAR(s));
END;
/

声明已处理。 乘积之和等于:166

为了更好地理解循环是如何结束的,您需要在流程中添加一些行,以帮助您理解为什么会得到 166

SQL> SET SERVEROUTPUT ON SIZE UNLIMITED
 SQL> DECLARE
  2  s PLS_INTEGER := 0;
  3  i PLS_INTEGER := 0;
  4  j PLS_INTEGER;
  5  BEGIN
  6  <<outer_loop>>
  7  LOOP
  8  i := i + 1;
  9  j := 0;
 10  <<inner_loop>>
 11  LOOP
 12  j := j + 1;
 13  s := s + i * j; -- Sum several products
 14  dbms_output.put_line( ' I is : '||to_char(i)||' ');
 15  dbms_output.put_line( ' J is : '||to_char(j)||' ');
 16  dbms_output.put_line( ' S is : '||to_char(s)||' ');
 17  EXIT inner_loop WHEN (j > 5);
 18  EXIT outer_loop WHEN ((i * j) > 15);
 19  END LOOP inner_loop;
 20  END LOOP outer_loop;
 21  DBMS_OUTPUT.PUT_LINE
 22  ('The sum of products equals: ' || TO_CHAR(s));
 23* END;
SQL> /
I is : 1
J is : 1
S is : 1
I is : 1
J is : 2
S is : 3
I is : 1
J is : 3
S is : 6
I is : 1
J is : 4
S is : 10
I is : 1
J is : 5
S is : 15
I is : 1
J is : 6
S is : 21
I is : 2
J is : 1
S is : 23
I is : 2
J is : 2
S is : 27
I is : 2
J is : 3
S is : 33
I is : 2
J is : 4
S is : 41
I is : 2
J is : 5
S is : 51
I is : 2
J is : 6
S is : 63
I is : 3
J is : 1
S is : 66
I is : 3
J is : 2
S is : 72
I is : 3
J is : 3
S is : 81
I is : 3
J is : 4
S is : 93
I is : 3
J is : 5
S is : 108
I is : 3
J is : 6
S is : 126
I is : 4
J is : 1
S is : 130
I is : 4
J is : 2
S is : 138
I is : 4
J is : 3
S is : 150
I is : 4
J is : 4
S is : 166
The sum of products equals: 166

PL/SQL procedure successfully completed.

SQL>

该循环应用您在代码中获得的公式,它是适用于两个循环的 EXIT WHEN,它定义了循环结束的时间。在您的情况下,第一个循环应该在 J > 5 时结束,但是您有一个辅助循环需要在之前结束并且它仅在 ((i * j) > 15 时结束,这仅在 i = 4 和 j = 4 , 所以 16.

希望它能澄清一点

您只需在 INNER_LOOP 中使用一个 DBMS_OUTPUT 就可以理解,如下所示:

SQL> SET SERVEROUT ON
SQL>
SQL> DECLARE
  2  S   PLS_INTEGER := 0;
  3  I   PLS_INTEGER := 0;
  4  J   PLS_INTEGER;
  5  BEGIN
  6  <<OUTER_LOOP>> LOOP
  7  I   := I + 1;
  8  J   := 0;
  9  <<INNER_LOOP>> LOOP
 10  J   := J + 1;
 11  S   := S + I * J; -- Sum several products
 12  DBMS_OUTPUT.PUT_LINE('I: ' || I || ' , J: ' || J || ' , S: ' || S);
 13  EXIT INNER_LOOP WHEN ( J > 5 );
 14  EXIT OUTER_LOOP WHEN ( ( I * J ) > 15 );
 15  END LOOP INNER_LOOP;
 16  END LOOP OUTER_LOOP;
 17  DBMS_OUTPUT.PUT_LINE('The sum of products equals: ' || TO_CHAR(S));
 18  END;
 19  /
I: 1 , J: 1 , S: 1
I: 1 , J: 2 , S: 3
I: 1 , J: 3 , S: 6
I: 1 , J: 4 , S: 10
I: 1 , J: 5 , S: 15
I: 1 , J: 6 , S: 21
I: 2 , J: 1 , S: 23
I: 2 , J: 2 , S: 27
I: 2 , J: 3 , S: 33
I: 2 , J: 4 , S: 41
I: 2 , J: 5 , S: 51
I: 2 , J: 6 , S: 63
I: 3 , J: 1 , S: 66
I: 3 , J: 2 , S: 72
I: 3 , J: 3 , S: 81
I: 3 , J: 4 , S: 93
I: 3 , J: 5 , S: 108
I: 3 , J: 6 , S: 126
I: 4 , J: 1 , S: 130
I: 4 , J: 2 , S: 138
I: 4 , J: 3 , S: 150
I: 4 , J: 4 , S: 166
The sum of products equals: 166

PL/SQL procedure successfully completed.

SQL>