循环语句:LOOP,WHILE和数字式循环

一 简单循环

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;

猜你喜欢

转载自www.cnblogs.com/rxhuiu/p/9108947.html