PL/SQL Flow Control Example

PL/SQL流程控制结构包括:条件控制、循环控制、顺序控制。

条件控制

  • IF...THEN...ENDIF结构
  • IF...THEN...ELSE...ENDIF结构
DECLARE
   v_ename   VARCHAR2 (20);
   v_sal     NUMBER (7, 2);
BEGIN
   SELECT ename, sal
     INTO v_ename, v_sal
     FROM emp
    WHERE empno = &eno;

   DBMS_OUTPUT.put_line (v_ename || '雇员的工资' || v_sal);

   IF v_sal < 1000
   THEN
      DBMS_OUTPUT.put_line ('工资低于1000');
   ELSE
      IF 1000 <= v_sal AND v_sal < 5000
      THEN
         DBMS_OUTPUT.put_line ('工资在1000到5000之间');
      ELSE
         DBMS_OUTPUT.put_line ('工资高于5000');
      END IF;
   END IF;
END;
/
  •  IF...THEN...ELSEIF...ENDIF结构
DECLARE
   v_ename      VARCHAR2 (20);
   v_hiredate   DATE;
   v_bonus      NUMBER (6, 2);
BEGIN
   SELECT ename, hiredate
     INTO v_ename, v_hiredate
     FROM emp
    WHERE empno = &eno;

   IF v_hiredate > TO_DATE ('01-JAN-95')
   THEN
      v_bonus := 800;
   ELSIF v_hiredate > TO_DATE ('01-JAN-90')
   THEN
      v_bonus := 1600;
   ELSE
      v_bonus := 2400;
   END IF;

   DBMS_OUTPUT.put_line (
         v_ename
      || '雇员的雇佣日期是'
      || v_hiredate
      || '、奖金是'
      || v_bonus);
END;
/
  •  case结构

    example1

DECLARE
   v_ename   VARCHAR2 (20);
   v_sal     NUMBER (7, 2);
BEGIN
   SELECT ename, sal
     INTO v_ename, v_sal
     FROM emp
    WHERE empno = 7788;

   DBMS_OUTPUT.put_line (
      '雇员名称:' || v_ename || ' 工资:' || v_sal);

   CASE
      WHEN v_sal < 1000
      THEN
         DBMS_OUTPUT.put_line ('工资低于1000');
      WHEN 1000 <= v_sal AND v_sal < 5000
      THEN
         DBMS_OUTPUT.put_line ('工资在1000到5000之间');
      ELSE
         DBMS_OUTPUT.put_line ('工资高于5000');
   END CASE;
END;
/

    example2

DECLARE
   v_grade   CHAR := 'B';
BEGIN
   CASE v_grade
      WHEN 'A'
      THEN
         DBMS_OUTPUT.put_line ('Excellent');
      WHEN 'B'
      THEN
         DBMS_OUTPUT.put_line ('Very good');
      WHEN 'C'
      THEN
         DBMS_OUTPUT.put_line ('Good');
      ELSE
         DBMS_OUTPUT.put_line ('NO such grade');
   END CASE;
END;
/

循环控制

  • LOOP...ENDLOOP结构
DECLARE
   v_i   NUMBER := 1;
   v_s   NUMBER := 0;
BEGIN
   LOOP
      EXIT WHEN v_i > 100;
      v_s := v_s + v_i;
      v_i := v_i + 1;
   END LOOP;

   DBMS_OUTPUT.put_line (v_s);
END;
/
  •  WHILE...LOOP...ENDLOOP结构
DECLARE
   v_i   NUMBER := 1;
   v_s   NUMBER := 0;
BEGIN
   WHILE v_i <= 100
   LOOP
      v_s := v_s + v_i;
      v_i := v_i + 1;
   END LOOP;

   DBMS_OUTPUT.put_line (v_s);
END;
/
  •  FOR...LOOP...ENDLOOP结构
DECLARE
   v_s   NUMBER := 0;
BEGIN
   FOR v_i IN 1 .. 100
   LOOP
      v_s := v_s + v_i;
   END LOOP;

   DBMS_OUTPUT.put_line (v_s);
END;
/

顺序控制

顺序控制中用到的语句有:GOTO语句、NULL语句。

  • GOTO语句

    GOTO语句是一条无条件跳转语句,它能实现语句从一处无条件地跳转到一个用标签指定的另一条可执行语句处或一个       PL/SQL块。但过多地使用GOTO语句将导致复杂的结果,破坏程序的结构,使程序难以理解和维护。所以,一般只用在     从一个PL/SQL块中跳转到异常处理的语句前面。

DECLARE
   v_i   NUMBER := 0;
   v_s   NUMBER := 0;
BEGIN
  <<label_1>>
   v_i := v_i + 1;

   IF v_i <= 100
   
   THEN
      v_s := v_s + v_i;
      GOTO label_1;
   END IF;

   DBMS_OUTPUT.put_line (v_s);
END;
/
 
  • NULL语句

    NULL语句是一个可执行语句,但它是不执行任何操作的空语句或占位语句,即它什么操作也不做就将控制交给下一个语     句。NULL语句的作用是提高程序的可读性,保证其他语句结构的完整性、正确性。如,IF语句中的每个子句都必须包括     一个可执行语句,否则就会出现错误提示。

DECLARE
   v_empno   emp.empno%TYPE;
   v_ename   emp.ename%TYPE;
   v_sal     emp.sal%TYPE;
   v_comm    emp.comm%TYPE;
BEGIN
   v_empno := &eno;

   SELECT ename, sal
     INTO v_ename, v_sal
     FROM emp
    WHERE empno = v_empno;

   IF v_sal <= 3000
   THEN
      v_comm := v_sal * 0.15;

      UPDATE emp
         SET comm = v_comm
       WHERE empno = v_empno;

      DBMS_OUTPUT.put_line (v_ename || ' 的补助是 ' || v_comm);
   ELSE
      NULL;
   END IF;
END;
/

    当采用从上到下的设计思想来设计PL/SQL程序时,NULL语句是创造占位程序的一个方法。占位程序是一个假的子程序    (过程、函数),它可以帮助你推迟对子程序的定义或编写,直到调试完主程序为止。这样就不会因为编写细节二耽误其     他程序或主程序的开发。

猜你喜欢

转载自agilestyle.iteye.com/blog/1742507
今日推荐