PL/SQL程序设计 第三章 PL/SQL流程控制语句

介绍PL/SQL的流程控制语句, 包括如下三类:
l 控制语句: IF 语句
l 循环语句: LOOP语句, EXIT语句
l 顺序语句: GOTO语句, NULL语句
§3.1   条件语句
IF <布尔表达式> THEN
PL/SQL 和 SQL语句
END IF;
 
IF <布尔表达式> THEN
PL/SQL 和 SQL语句
ELSE
其它语句
END IF;
 
IF <布尔表达式> THEN
PL/SQL 和 SQL语句
ELSIF < 其它布尔表达式> THEN
其它语句
ELSIF < 其它布尔表达式> THEN
其它语句
ELSE
其它语句
END IF;
 
提示: ELSIF 不能写成 ELSEIF
 
例1:
DECLARE
   v_empno emp.empno%TYPE :=&empno;
    V_salary emp.sal%TYPE;
    V_comment VARCHAR2(35);
BEGIN
  SELECT sal INTO v_salary FROM emp WHERE empno=v_empno;
   IF v_salary<1500 THEN
       V_comment:= ‘Fairly less’;
   ELSIF v_salary <3000 THEN
      V_comment:= ‘A little more’;
   ELSE
      V_comment:= ‘Lots of salary’;
   END IF;
   DBMS_OUTPUT.PUT_LINE(V_comment);
END;
 
CASE selector
       WHEN expression1 THEN result1
       WHEN expression2 THEN result2
 
       WHEN expressionN THEN resultN
       [ ELSE resultN+1]
END;
 
例2:
 
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;
 
 
 1. 简单循环
LOOP
      要执行的语句;
      EXIT WHEN <条件语句>       /*条件满足,退出循环语句*/
END LOOP;
 
例 3.
DECLARE
    int NUMBER(2) :=0;
BEGIN
   LOOP
      int := int + 1;
      DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||int);
      EXIT WHEN int =10;
   END LOOP;
END;
 
2. WHILE 循环
 
WHILE <布尔表达式> LOOP
   要执行的语句;
END LOOP;
 
例4.
DECLARE
x NUMBER;
BEGIN
   x:= 1;
   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 退出循环。
 
例5.
BEGIN
   FOR int  in 1..10 LOOP
       DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||int);
   END LOOP;
END;
 
例 6.
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;
§3.3 标号和GOTO
PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:
 
GOTO   label;
 . . . . . .
<<label>> /*标号是用<< >>括起来的标识符 */
 
例7:
DECLARE
   V_counter NUMBER := 1;
BEGIN
   LOOP
     DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
 V_counter := v_counter + 1;
 IF v_counter > 10 THEN
    GOTO l_ENDofLOOP;
 END IF;
   END LOOP;
 <<l_ENDofLOOP>>
     DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
END ;
在PL/SQL 程序中,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符,可以使某些语句变得有意义,提高程序的可读性。如:
DECLARE
. . .
BEGIN
IF v_num IS NULL THEN
GOTO print1;
END IF;
<<print1>>
NULL; -- 不需要处理任何数据。
END;
posted @ 2014-03-25 00:35  明月镇魂  阅读(221)  评论(0编辑  收藏  举报