一 简单循环

1 语法:

LOOP
要执行的语句;
EXIT WHEN <条件语句> --条件满足,退出循环语句
END LOOP;

2 例子:

DECLARE
int NUMBER(2) :=0;
BEGIN
LOOP
int := int + 1;
DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||int);
EXIT WHEN int =10;
END LOOP;
END;

二 WHILE循环

1 语法:

WHILE <布尔表达式> LOOP
要执行的语句;
END LOOP;

2 例子:

DECLARE
x NUMBER :=1;
BEGIN
WHILE x<=10 LOOP
DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x);
x:= x+1;
END LOOP;
END;

三 数字式循环

1 语法:

[<<循环标签>>]
FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
要执行的语句;
END LOOP [循环标签];

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1 。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数 ,不能是变量或表达式。可以使用EXIT退出循环

2 例子:

BEGIN
**FOR int  in 1..10 LOOP**
**       DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||int);**
**   END LOOP;**
END;

CREATE TABLE temp_table(num_col NUMBER);
DECLARE
V_counter NUMBER := 10;
BEGIN
INSERT INTO temp_table(num_col) VALUES (v_counter );
**FOR v_counter IN 20 .. 25 LOOP**
**      INSERT INTO temp_table (num_col ) VALUES ( v_counter );**
**   END LOOP;**
INSERT INTO temp_table(num_col) VALUES (v_counter );
**FOR v_counter IN REVERSE 20 .. 25 LOOP**
**      INSERT INTO temp_table (num_col ) VALUES ( v_counter );**
**   END LOOP;**
END ;
DROP TABLE temp_table;

DECLARE
TYPE jobids_varray IS VARRAY(12) OF VARCHAR2(10); --定义一个VARRAY数据类型
v_jobids JOBIDS_VARRAY; --声明一个具有JOBIDS_VARRAY数据类型的变量
v_howmany NUMBER; --声明一个变量来保存雇员的数量
BEGIN
--用某些job_id值初始化数组
v_jobids := jobids_varray('FI_ACCOUNT', 'FI_MGR', 'ST_CLERK', 'ST_MAN');

**--用FOR...LOOP...END LOOP循环使用每个数组成员的值**
**FOR i IN v_jobids.FIRST..v_jobids.LAST LOOP**
**   --针对数组中的每个岗位,决定该岗位的雇员的数量**
**      SELECT count(*) INTO v_howmany FROM employees WHERE job_id = v_jobids(i);**
**      DBMS_OUTPUT.PUT_LINE ( '岗位'||v_jobids(i)||**
**                       '总共有'|| TO_CHAR(v_howmany) || '个雇员');**
**   END LOOP;**
END;

在While循环中嵌套loop循环

/*求100至110之间的素数*/
DECLARE
v_m NUMBER := 101;
v_i NUMBER;
v_n NUMBER := 0;
BEGIN
**WHILE v_m < 110 LOOP**
**      v_i := 2;**
**      LOOP**
**         IF mod(v_m, v_i) = 0 THEN**
**            v_i := 0;**
**            EXIT;**
**         END IF;**

---

**         v_i := v_i + 1;**
**         EXIT WHEN v_i > v_m - 1; **
**      END LOOP;**

---

**      IF v_i > 0 THEN**
**         v_n := v_n + 1;**
**         DBMS_OUTPUT.PUT_LINE('第'|| v_n || '个素数是' || v_m);**
**      END IF;**

**      v_m := v_m + 2;**
**   END LOOP;**
END;
最后修改:2021 年 11 月 17 日
如果觉得我的文章对你有用,请随意赞赏