Sql oracle server中的嵌套循环

Sql oracle server中的嵌套循环,sql,oracle,plsql,nested-loops,procedure,Sql,Oracle,Plsql,Nested Loops,Procedure,我不是软件程序员。我想为我的工作学习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; <

我不是软件程序员。我想为我的工作学习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;
/
声明
s PLS_整数:=0;
i PLS_整数:=0;
j PLS_整数;
开始
环
i:=i+1;
j:=0;
环
j:=j+1;
s:=s+i*j;——求几个乘积的和
当(j>5)时退出内循环;
当((i*j)>15时退出外环;
端环-内环;
端环外环;
DBMS_OUTPUT.PUT_行
(“乘积之和等于:”| | TO_CHAR(s));
结束;
/
已处理对账单。
乘积之和等于: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>
SQL>将SERVEROUTPUT设置为大小不限
SQL>声明
2 s PLS_整数:=0;
3 i PLS_整数:=0;
4j PLS_整数;
5开始
6.
7环路
8i:=i+1;
9j:=0;
10
11环路
12j:=j+1;
13 s:=s+i*j;——求几个乘积的和
14 dbms_输出.put_行('I is:'| | to_char(I)| |');
15 dbms_输出.put_行('J为:'| |至_字符(J)| |');
16 dbms|u输出.put|u行('S为:'| | to|u char(S)| |');
17当(j>5)时退出内_环;
18当((i*j)>15时退出外环;
19端环-内环;
20端环外环;
21 DBMS_OUTPUT.PUT_行
22('乘积之和等于:'| |到_CHAR(s));
23*结束;
SQL>/
我是:1
J is:1
S:1
我是:1
J is:2
S:3
我是:1
J is:3
S:6
我是:1
J is:4
S:10
我是:1
J:5
S:15
我是:1
J is:6
S:21
我是:2
J is:1
S:23
我是:2
J is:2
S:27
我是:2
J is:3
S:33
我是:2
J is:4
S:41
我是:2
J:5
S:51
我是:2
J is:6
S:63
我是:3
J is:1
S:66
我是:3
J is:2
S:72
我是:3
J is:3
S:81
我是:3
J is:4
S:93
我是:3
J:5
S:108
我是:3
J is:6
S:126
我是:4
J is:1
S:130
我是:4
J is:2
S:138
我是:4
J is:3
S:150
我是:4
J is:4
S:166
乘积之和等于:166
PL/SQL过程已成功完成。
SQL>
循环应用您在代码中得到的公式,它是应用于两个循环的出口,定义了循环结束的时间。在您的例子中,第一个循环应该在J>5时结束,但是您有一个需要在之前结束的二次循环,它只在((i*J)>15时结束,这只在i=4和J=4时发生,因此16


希望它能澄清一点

为了让您更好地理解循环是如何结束的,您需要在流程中添加一些行,以帮助您理解为什么会得到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>
SQL>将SERVEROUTPUT设置为大小不限
SQL>声明
2 s PLS_整数:=0;
3 i PLS_整数:=0;
4j PLS_整数;
5开始
6.
7环路
8i:=i+1;
9j:=0;
10
11环路
12j:=j+1;
13 s:=s+i*j;--几个乘积之和
14 dbms_输出.put_行('I is:'| | to_char(I)| |');
15 dbms_输出.put_行('J为:'| |至_字符(J)| |');
16 dbms|u输出.put|u行('S为:'| | to|u char(S)| |');
17当(j>5)时退出内_环;
18当((i*j)>15时退出外环;
19端环-内环;
20端环外环;
21 DBMS_OUTPUT.PUT_行
22('乘积之和等于:'| |到_CHAR(s));
23*结束;
SQL>/
我是:1
J is:1
S:1
我是:1
J is:2
S:3
我是:1
J is:3
S:6
我是:1
J is:4
S:10
我是:1
J:5
S:15
我是:1
J is:6
S:21
我是:2
J is:1
S:23
我是:2
J is:2
S:27
我是:2
J is:3
S:33
我是:2
J is:4
S:41
我是:2
J:5
S:51
我是:2
J is:6
S:63
我是:3
J is:1
S:66
我是:3
J is:2
S:72
我是:3
J is:3
S:81
我是:3
J is:4
S:93
我是:3
J:5
S:108
我是:3
J is:6
S:126
我是:4
J is:1
S:130
我是:4
J is:2
S:138
我是:4
J is:3
S:150
我是:4
J is:4
S:166
乘积之和等于:166
PL/SQL过程已成功完成。
SQL>
循环应用了代码中的公式,它是应用于两个循环的出口,定义了循环结束的时间。在您的例子中,第一个循环应该在J>5时结束,但是您有一个需要在之前结束的二次循环,它只在((i*J)>15时结束,这只在i=4和J=4时发生,所以是16


希望它能澄清一点

您只需在内部循环中使用一个DBMS_输出,即可获得以下想法:

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>
SQL>在上设置服务器
SQL>
SQL>声明
2 S PLS_整数:=0;
3 I PLS_整数:=0;
4j PLS_整数;
5开始
6环路
7 I:=I+1;
8j:=0;
9环路
10j:=J+1;
11s:=S+I*J;--几个乘积之和
12 DBMS|u输出.PUT|u行('I:'| I | |',J:'| J | |',S:'| | S);
13当(J>5)时退出内_环;
14当((I*J)>15时退出外环;
15端环-内环;
16端环外环;
17 DBMS_OUTPUT.PUT_LINE('乘积之和等于:'| | TO_CHAR(S));
18结束;
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
乘积之和等于:166
PL/SQL过程已成功完成。
SQL>

您只需在内部循环中使用一个DBMS\u输出,即可获得以下想法:

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>
SQL>在上设置服务器
SQL>
SQL>声明
2 S PLS_整数:=0;
3 I PLS_整数:=0;
4j PLS_整数;
5开始
6环路
7 I:=I+1;
8.