PL/SQL(三) 流程控制语句

逆流者 2020年03月15日 59次浏览

共三类:

  • 控制语句: IF 语句
  • 循环语句: LOOP 语句, EXIT 语句
  • 顺序语句: GOTO 语句, NULL 语句

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
示例:

DECLARE
  v_empno emp.empno%TYPE;
  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;

2、CASE 表达式

CASE selector
  WHEN expression1 THEN result1
  WHEN expression2 THEN result2
  WHEN expressionN THEN resultN
  [ ELSE resultN+1 ]
END; 

示例

DECLARE
  V_grade char(1) ;
  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;

3、循环

3.1. 简单循环

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

示例:

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

3.2. WHILE 循环(相较 1,推荐使用 2)

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

示例:

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

3.3. 数字式循环

FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
 要执行的语句;
END LOOP;
  • 每循环一次,循环变量自动加 1;
  • 使用关键字 REVERSE,循环变量自动减 1。
  • 跟在 IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。
  • 可以使用 EXIT 退出循环。
    示例1:
BEGIN
 FOR int in 1..10 LOOP
 DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||int);
 END LOOP;
END;

示例2:

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;

4、标号和 GOTO

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

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

示例:

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 ;

5、NULL 语句

在 PL/SQL 程序中,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符,可以使某些语句变得有意义,提高程序的可读性。如:

DECLARE
. . .
BEGIN
…
IF v_num IS NULL THEN
  GOTO print1;
END IF;
…
<<print1>>
NULL; -- 不需要处理任何数据。
END;