kution 发表于 2018-10-19 12:56:05

PL/SQL流程控制语句

  介绍PL/SQL的流程控制语句, 包括如下三类:
l 控制语句: IF 语句
  l 循环语句: LOOP语句, EXIT语句
  l 顺序语句: GOTO语句, NULL语句
  1条件语句
  IFTHEN
  PL/SQL 和 SQL语句
  END IF;
IFTHEN
  PL/SQL 和 SQL语句
  ELSE
  其它语句
  END IF;
  IFTHEN
  PL/SQL 和 SQL语句
  ELSIF < 其它布尔表达式> THEN
  其它语句
  ELSIF < 其它布尔表达式> THEN
  其它语句
  ELSE
  其它语句
  END IF;
  提示: ELSIF 不能写成 ELSEIF
  例1:
  SQL> conn hr/hr@pdbtest
  Connected.
  SQL> set serveroutput on
  SQL> DECLARE
  2      v_empnoemployees.employee_id%TYPE :=&empno;
  3      V_salary employees.salary%TYPE;
  4      V_comment VARCHAR2(35);
  5BEGIN
  6   SELECT salary INTO v_salary FROM employees
  7   WHERE employee_id = v_empno;
  8   IF v_salary < 1500 THEN
  9         V_comment:= '太少了,加点吧~!';
  10   ELSIF v_salaryDECLARE
  2    V_grade char(1) := UPPER('&p_grade');
  3    V_appraisal VARCHAR2(20);
  4BEGIN
  5    V_appraisal :=
  6    CASE v_grade
  7      WHEN 'A' THEN 'Excellent'
  8      WHEN 'B' THEN 'Very Good'
  9      WHEN 'C' THEN 'Good'
  10      ELSE 'No such grade'
  11    END;
  12    DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'Appraisal: '|| v_appraisal);
  13END;
  14/
  Enter value for p_grade: D
  old   2:   V_grade char(1) := UPPER('&p_grade');
  new   2:   V_grade char(1) := UPPER('D');
  Grade:DAppraisal: No such grade
  PL/SQL procedure successfully completed.
  3循环

[*]  1 简单循环
  LOOP
  要执行的语句;
  EXIT WHEN--条件满足,退出循环语句
  END LOOP;
  3.2WHILE 循环
  WHILELOOP
  要执行的语句;
  END LOOP;
  3.3数字式循环
  []
  FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP
  要执行的语句;
  END LOOP [循环标签];
  每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。
  实例参见Oracle LOOP循环控制语句
  例1 在While循环中嵌套loop循环
  SQL> DECLARE
  2   v_m NUMBER := 101;
  3   v_i NUMBER;
  4   v_n NUMBER := 0;
  5BEGIN
  6   WHILE v_m < 110 LOOP
  7      v_i := 2;
  8      LOOP
  9         IF mod(v_m, v_i) = 0 THEN
  10            v_i := 0;
  11            EXIT;
  12         END IF;
  13
  14         v_i := v_i + 1;
  15         EXIT WHEN v_i > v_m - 1;
  16      END LOOP;
  17
  18      IF v_i > 0 THEN
  19         v_n := v_n + 1;
  20         DBMS_OUTPUT.PUT_LINE('第'|| v_n || '个素数是' || v_m);
  21      END IF;
  22
  23      v_m := v_m + 2;
  24   END LOOP;
  25END;
  26/
  第1个素数是101
  第2个素数是103
  第3个素数是107
  第4个素数是109
  PL/SQL procedure successfully completed.
  4标号和GOTO
  PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:
  GOTO label;
  ......
   /标号是用括起来的标识符 /
  注意,在以下地方使用是不合法的,编译时会出错误。
  跳转到非执行语句前面。
  跳转到子块中。
  跳转到循环语句中。
  跳转到条件语句中。
  从异常处理部分跳转到执行。
  从条件语句的一部分跳转到另一部分。
  例1:
  SQL> DECLARE
  2   V_counter NUMBER := 1;
  3BEGIN
  4   LOOP
  5       DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
  6       V_counter := v_counter + 1;
  7   IF v_counter > 10 THEN
  8         GOTO labelOffLOOP;
  9   END IF;
  10   END LOOP;
  11   
  12       DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);
  13END;
  14/
  V_counter的当前值为:1
  V_counter的当前值为:2
  V_counter的当前值为:3
  V_counter的当前值为:4
  V_counter的当前值为:5
  V_counter的当前值为:6
  V_counter的当前值为:7
  V_counter的当前值为:8
  V_counter的当前值为:9
  V_counter的当前值为:10
  V_counter的当前值为:11
  PL/SQL procedure successfully completed.
  5NULL 语句
  在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:
  例1:
  SQL> DECLARE
  2   v_emp_id employees.employee_id%TYPE;
  3   v_first_name employees.first_name%TYPE;
  4   v_salary employees.salary%TYPE;
  5   v_sal_raise NUMBER(3,2);
  6BEGIN
  7   v_emp_id := &emp_id;
  8   SELECT first_name, salary INTO v_first_name, v_salary
  9   FROM employees WHERE employee_id = v_emp_id;
  10   IF v_salary
页: [1]
查看完整版本: PL/SQL流程控制语句