一、LOOP语句
1.语法:
LOOP
代码;
END LOOP;
2.例子:
create or replace procedure pro_loop(a int) as
begin
loop
if a<=0 then
exit;
end if;
print(a);
a:=a-1;
end loop;
end;
call pro_loop(9);结果:
9
8
7
6
5
4
3
2
1
二、while语句
1.语法:
WHILE 条件 LOOP
代码
END LOOP;
2.例子:
create or replace procedure pro_while(a int) as
begin
while a>0 loop
print(a);
a:=a-1;
end loop;
end;
call pro_while(3);结果:
3
2
1
三、for语句
1.语法:
for [循环计数器] in [REVERSE] [下限]..[上限] loop
代码;
end loop;
2.例子:
CREATE OR REPLACE PROCEDURE PROC_FOR1 (a IN OUT INT) AS
BEGIN
FOR I IN REVERSE 1 .. a LOOP
PRINT I;
a:=I-1;
END LOOP;
END;
call proc_for1(5);结果:
5
4
3
2
1
四、REPEAT语句
1.语法:
REPEAT
代码;
UNTIL 条件表达式;
2.说明:该语句是先执行后判断条件是否为true,如果是继续循环,如果是false,结束循环,该循环语句至少执行一次;
3.例子:
create or replace procedure pro_repeat(a int) as
begin
repeat
print a;
a:=a-1;
until a<=0;
end;
call pro_repeat(5);结果:
5
4
3
2
1
五、forall语句
1.语法
FORALL<循环计数器> IN <bounds_clause> [SAVE EXCEPTIONS] <forall_dml_stmt>;
<bounds_clause> ::= <下限表达式>..<上限表达式>
| INDICES OF <集合> [BETWEEN ] <下限表达式> AND <上限表达式>
| VALUES OF <集合>
<forall_dml_stmt> ::= <INSERT 语句>| <UPDATE 语句> | <DELETE 语句> | <MERGE INTO 语句>
2.说明:
SAVE EXCEPTIONS:指定即使一些DML 语句失败,直到FORALL 执行结束才抛出异常。
INDICES OF <集合>:跳过集合中没有赋值的元素,可用于指向稀疏数组的实际下标。
VALUES OF <集合>:把该集合中的值作为下标。
3.例子:
create or replace procedure pro_forall as
begin
forall i in 1..10
insert into t1_forall select ID,NAME from PERSON;
end;
call pro_forall;
select * from t1_forall;
六、EXIT语句
1.语法:
EXIT [<标号名>] [WHEN <条件表达式>];
退出循环的标志,如果有标号名,则以标号的循环语句退出,如果省略标号名,则以包含exit的循环语句结束。
2.以下两个例子说明:
DECLARE
a INT;
b INT;
BEGIN
a := 0;
LOOP
FOR b in 1 .. 2 LOOP
PRINT '内层循环' ||b;
EXIT WHEN a > 3;
END LOOP;
a := a + 2;
PRINT '---外层循环' ||a;
EXIT WHEN a> 5;
END LOOP;
END;结果:
内层循环1
内层循环2
---外层循环2
内层循环1
内层循环2
---外层循环4
内层循环1
---外层循环6
DECLARE
a INT;
b INT;
BEGIN
a := 0;
<<flag1>>
LOOP
FOR b in 1 .. 2 LOOP
PRINT '内层循环' ||b;
EXIT flag1 WHEN a > 3;
END LOOP; a := a + 2;
PRINT '---外层循环' ||a;
EXIT WHEN a> 5;
END LOOP;
END;结果:
内层循环1
内层循环2
---外层循环2
内层循环1
内层循环2
---外层循环4
内层循环1
3.when省略,直接终止循环
DECLARE
a int;
begin
a:=2;
loop
print '循环'||a;
exit;
end loop;
end;结果:循环2
七、CONTINUE语句
1.语法:CONTINUE [[标号名] WHEN <条件表达式>];
2.说明:
若CONTINUE 后没有跟WHEN 子句,则无条件立即退出当前循环,并且将语句控制转 移到这次循环的下一次循环迭代或者是一个指定标号名的循环的开始位置并继续执行。
DECLARE
x INT:= 0;
BEGIN
<<flag1>> -- CONTINUE 跳出之后,回到这里
FOR I IN 1..4 LOOP
print('循环内部,CONTINUE 之前: x = ' || TO_CHAR(x)); x := x + 1;
CONTINUE flag1;
print('循环内部,CONTINUE 之后: x = ' || TO_CHAR(x));
END LOOP;
print(' 循环外部: x = ' || TO_CHAR(x));
END;结果:
循环内部,CONTINUE 之前: x = 0
循环内部,CONTINUE 之前: x = 1
循环内部,CONTINUE 之前: x = 2
循环内部,CONTINUE 之前: x = 3
循环外部: x = 4
若CONTINUE 语句中包含WHEN 子句,则当WHEN 子句的条件表达式为TURE 时才退 出当前循环,将语句控制转移到下一次循环迭代或者是一个指定标号名的循环的开始位置并 继续执行。
DECLARE
x INT:= 0;
BEGIN -- CONTINUE 跳出之后,回到这里
FOR I IN 1..4 LOOP
print ('循环内部,CONTINUE 之前: x = ' || TO_CHAR(x));
x := x + 1;
CONTINUE WHEN x > 3;
print('循环内部,CONTINUE 之后: x = ' || TO_CHAR(x));
END LOOP;
print (' 循环外部: x = ' || TO_CHAR(x));
END;结果:
循环内部,CONTINUE 之前: x = 0
循环内部,CONTINUE 之后: x = 1
循环内部,CONTINUE 之前: x = 1
循环内部,CONTINUE 之后: x = 2
循环内部,CONTINUE 之前: x = 2
循环内部,CONTINUE 之后: x = 3
循环内部,CONTINUE 之前: x = 3
循环外部: x = 4