【转】oracle之循环语法

 

本篇主要内容如下:

3.1  条件语句

3.2 CASE 表达式

3.3  循环

3.4  标号和GOTO

3.5  NULL 语句

 


 

 

介绍PL/SQL的流程控制语句, 包括如下三类:

 

l 控制语句: IF 语句

l 循环语句: LOOP语句, EXIT语句

l 顺序语句: GOTO语句, NULL语句

 

3.1  条件语句

 

复制代码
IF<布尔表达式>THEN   PL/SQL 和 SQL语句 ENDIF; -----------------------IF<布尔表达式>THEN   PL/SQL 和 SQL语句 ELSE   其它语句 ENDIF; -----------------------IF<布尔表达式>THEN   PL/SQL 和 SQL语句 ELSIF < 其它布尔表达式>THEN   其它语句 ELSIF < 其它布尔表达式>THEN   其它语句 ELSE   其它语句 ENDIF;
复制代码

 

 

提示: ELSIF 不能写成 ELSEIF

 

1:

 

复制代码
DECLARE     v_empno  employees.employee_id%TYPE :=&empno;     V_salary employees.salary%TYPE;     V_comment VARCHAR2(35); BEGIN    SELECT salary INTO v_salary FROM employees    WHERE employee_id = v_empno;    IF v_salary <1500THEN        V_comment:='太少了,加点吧~!';    ELSIF v_salary <3000THEN       V_comment:='多了点,少点吧~!';    ELSE       V_comment:='没有薪水~!';    ENDIF; DBMS_OUTPUT.PUT_LINE(V_comment);    exception      when no_data_found then         DBMS_OUTPUT.PUT_LINE('没有数据~!');      when others then         DBMS_OUTPUT.PUT_LINE(sqlcode ||'---'|| sqlerrm);        END;
复制代码

 

 

2:

 

复制代码
DECLARE    v_first_name  VARCHAR2(20);    v_salary NUMBER(7,2); BEGIN    SELECT first_name, salary INTO v_first_name, v_salary FROM employees    WHERE employee_id =&emp_id;    DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的工资是'||v_salary);    IF v_salary <10000THEN       DBMS_OUTPUT.PUT_LINE('工资低于10000');    ELSE       IF10000<= v_salary AND v_salary <20000THEN          DBMS_OUTPUT.PUT_LINE('工资在10000到20000之间');       ELSE          DBMS_OUTPUT.PUT_LINE('工资高于20000');       ENDIF;    ENDIF; END;
复制代码

 

 

3:

复制代码
DECLARE    v_first_name  VARCHAR2(20);    v_hire_date DATE;    v_bonus NUMBER(6,2); BEGIN    SELECT first_name, hire_date INTO v_first_name, v_hire_date FROM employees    WHERE employee_id =&emp_id;    IF v_hire_date > TO_DATE('01-1月-90') THEN       v_bonus :=800;    ELSIF v_hire_date > TO_DATE('01-1月-88') THEN       v_bonus :=1600;    ELSE       v_bonus :=2400;    ENDIF;    DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的雇佣日期是'||v_hire_date                                     ||'、奖金是'||v_bonus); END;
复制代码

 

3.2  CASE 表达式

 

复制代码
---------格式一---------CASE 条件表达式   WHEN 条件表达式结果1 THEN      语句段1   WHEN 条件表达式结果2 THEN      语句段2   ......   WHEN 条件表达式结果n THEN      语句段n   [ELSE 条件表达式结果]END; ---------格式二---------CASE   WHEN 条件表达式1 THEN      语句段1   WHEN 条件表达式2 THEN      语句段2   ......   WHEN 条件表达式n THEN      语句段n   [ELSE 语句段]END;
复制代码

 

 

4:

 

复制代码
DECLARE   V_grade char(1) :=UPPER('&p_grade');   V_appraisal VARCHAR2(20); BEGIN   V_appraisal :=   CASE v_grade     WHEN'A'THEN'Excellent'     WHEN'B'THEN'Very Good'     WHEN'C'THEN'Good'     ELSE'No such grade'   END;   DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'  Appraisal: '|| v_appraisal); END;
复制代码

 

 

5:

 

复制代码
DECLARE    v_first_name employees.first_name%TYPE;    v_job_id employees.job_id%TYPE;    v_salary employees.salary%TYPE;    v_sal_raise NUMBER(3,2); BEGIN    SELECT first_name,   job_id,   salary INTO           v_first_name, v_job_id, v_salary    FROM employees WHERE employee_id =&emp_id;    CASE       WHEN v_job_id ='PU_CLERK'THEN          IF v_salary <3000THEN v_sal_raise := .08;          ELSE v_sal_raise := .07;          ENDIF;       WHEN v_job_id ='SH_CLERK'THEN          IF v_salary <4000THEN v_sal_raise := .06;          ELSE v_sal_raise := .05;          ENDIF;       WHEN v_job_id ='ST_CLERK'THEN          IF v_salary <3500THEN v_sal_raise := .04;          ELSE v_sal_raise := .03;          ENDIF;       ELSE          DBMS_OUTPUT.PUT_LINE('该岗位不涨工资: '||v_job_id);    ENDCASE;    DBMS_OUTPUT.PUT_LINE(v_first_name||'的岗位是'||v_job_id                                     ||'、的工资是'||v_salary                                     ||'、工资涨幅是'||v_sal_raise); END;
复制代码

 

 

 

 

3.3  循环

1.  简单循环

 

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

 

 

 

6.

 

复制代码
DECLARE     intNUMBER(2) :=0; BEGIN    LOOP       int :=int+1;       DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||int);       EXITWHENint=10;    END LOOP; END;
复制代码

 

 

2.  WHILE 循环

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

 

 

 

 

7.

 

 

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

 

 

3.  数字式循环

 

 

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

 

 

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

 

8.

 

 

BEGIN    FORint  in1..10 LOOP        DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||int);    END LOOP; END;

 

 

9.

 

复制代码
CREATETABLE temp_table(num_col NUMBER);
DECLARE     V_counter NUMBER :=10; BEGIN    INSERTINTO temp_table(num_col) VALUES (v_counter );    FOR v_counter IN20 .. 25 LOOP       INSERTINTO temp_table (num_col ) VALUES ( v_counter );    END LOOP;    INSERTINTO temp_table(num_col) VALUES (v_counter );    FOR v_counter INREVERSE20 .. 25 LOOP       INSERTINTO temp_table (num_col ) VALUES ( v_counter );    END LOOP; END ;
DROPTABLE temp_table;
复制代码

 

 

10:

 

复制代码
DECLARE    TYPE jobids_varray IS VARRAY(12) OFVARCHAR2(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
  
--针对数组中的每个岗位,决定该岗位的雇员的数量      SELECTcount(*) 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;
复制代码

 

 

11 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) =0THEN             v_i :=0;             EXIT;          ENDIF;              v_i := v_i +1;          EXITWHEN v_i > v_m -1;       END LOOP;             IF v_i >0THEN          v_n := v_n +1;          DBMS_OUTPUT.PUT_LINE(''|| v_n ||'个素数是'|| v_m);       ENDIF;
      v_m :
= v_m +2;    END LOOP; END;
复制代码

 

3.4  标号和GOTO

PL/SQLGOTO语句是无条件跳转到指定的标号去的意思。语法如下:

 

GOTO label; ...... <<label>> /*标号是用<< >>括起来的标识符 */

 

 

注意,在以下地方使用是不合法的,编译时会出错误。

u 跳转到非执行语句前面。

u 跳转到子块中。

u 跳转到循环语句中。

u 跳转到条件语句中。

u 从异常处理部分跳转到执行。

u 从条件语句的一部分跳转到另一部分。

 

12:

 

复制代码
DECLARE    V_counter NUMBER :=1; BEGIN    LOOP      DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);      V_counter := v_counter +1;    IF v_counter >10THEN        GOTO labelOffLOOP;    ENDIF;    END LOOP;    <<labelOffLOOP>>      DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter); END;
复制代码

 

 

13:

复制代码
DECLARE    v_i NUMBER :=0;    v_s NUMBER :=0; BEGIN    <<label_1>>    v_i := v_i +1;    IF v_i <=1000THEN       v_s := v_s + v_i;       GOTO label_1;    ENDIF;    DBMS_OUTPUT.PUT_LINE(v_s); END;
复制代码

 

3.5  NULL 语句

PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明不用做任何事情的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

14:

 

复制代码
DECLARE     ... BEGIN     ...     IF v_num ISNULLTHEN     GOTO labelPrint;     ENDIF;   …   <<labelPrint>>   NULL; --不需要处理任何数据。END;
复制代码

 

 

15:

 

复制代码
DECLARE    v_emp_id employees.employee_id%TYPE;    v_first_name employees.first_name%TYPE;    v_salary employees.salary%TYPE;    v_sal_raise NUMBER(3,2); BEGIN    v_emp_id :=&emp_id;    SELECT first_name, salary INTO v_first_name, v_salary    FROM employees WHERE employee_id = v_emp_id;    IF v_salary <=3000THEN       v_sal_raise := .10;       DBMS_OUTPUT.PUT_LINE(v_first_name||'的工资是'||v_salary                                        ||'、工资涨幅是'||v_sal_raise);    ELSE       NULL;    ENDIF; END;
复制代码

 

原文地址:https://www.cnblogs.com/dogxuefeng/p/2782588.html