控制结构

和其他编程语言一样,pl/sql中也存在控制结构:顺序结构,分支判断结构,循环结构。
这里主要讲下分支判断结构。pl/sql中的分支判断结构主要可以分为两类:一类是IF ... ELSE 类型的,另外一类就是CASE...
1.简单的分支判断
IF ...
 THEN...
END IF;
例子:
DECLARE
      v_myage NUMBER:=31;
BEGIN
      IF v_myage<11  
      THEN 
          DBMS_OUTPUT.PUT_LINE('I am a child!');
      END IF;
END;
/
2.两重分支判断
IF...
  THEN...
   ELSE...
END IF;
例子:
DECLARE
      v_myage NUMBER:=31;
BEGIN
      IF v_myage<11  
      THEN 
          DBMS_OUTPUT.PUT_LINE('I am a child!');
     ELSE
         DBMS_OUTPUT.PUT_LINE('I am not a child!');

      END IF;
END;
/
执行结果:
HR@orcl 18-SEP-14>@s10
I am not a child!

PL/SQL procedure successfully completed.

3.多重分支判断(要注意,不是ELSEIF,而是ELSIF!)
IF...
  THEN...
  ELSIF...
  THEN...
   ELSIF...
  THEN...
  ...
  ELSE...
END IF;
例子:
DECLARE
      v_myage NUMBER :=55;
BEGIN
      IF v_myage<11 THEN
         DBMS_OUTPUT.PUT_LINE('I am a child!');
      ELSIF v_myage<20 THEN
         DBMS_OUTPUT.PUT_LINE('I am young!');
      ELSIF v_myage<30 THEN
         DBMS_OUTPUT.PUT_LINE('I am in my twenties!');
      ELSIF v_myage<40 THEN
          DBMS_OUTPUT.PUT_LINE('I am in my thirties!');
      ELSE
           DBMS_OUTPUT.PUT_LINE('I am always young!');
    END IF;
END;
/
执行结果:
HR@orcl 18-SEP-14>@s11
I am always young

PL/SQL procedure successfully completed.

这里要注意有两种类型:simple if statement和null value in if statement。如果if判断的变量值为null或者false,那么if...then...后面的语句是不进行的,而会执行else后面的语句。下面举个例子:
DECLARE
     v_myage number;
BEGIN
     IF v_myage<11 THEN
        DBMS_OUTPUT.PUT_LINE('I am a child');
     ELSE
        DBMS_OUTPUT.PUT_LINE('I am not a child');
   END IF;
END;
/
执行结果:
HR@orcl 18-SEP-14>@s12.sql
I am not a child

PL/SQL procedure successfully completed.

下面讲讲CASE类型的,分为两类:Simple Case Expressions,Searched Case Expressions
1.simple case expression:实际上就是在case后面直接给出变量
例子:
SET VERIFY OFF
DECLARE
     v_grade char(10) :=UPPER('&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;
/
执行结果:
HR@orcl 18-SEP-14>@case1
Enter value for grade: a
Grade:A            AppraisalExcellent

PL/SQL procedure successfully completed.

2.searched case expressions:实际上就是在CASE后不直接给出变量,而是在when后面给出变量,然后根据变量的值做出判断。
例子:
SET VERIFY OFF
DECLARE
     v_grade char(10) :=UPPER('&grade');
     v_appraisal VARCHAR2(20);
BEGIN
    v_appraisal :=CASE
          WHEN v_grade='A'  THEN 'Excellent'
          WHEN v_grade='B'   THEN 'Very Good'
          WHEN v_grade='C'   THEN 'Good' 
          ELSE 'No such grade'
  END;
DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'   Appraisal:'||v_appraisal);
END;
/

执行结果和上面的pl/sql是一样的:
HR@orcl 18-SEP-14>@case2
Enter value for grade: a
Grade:A            Appraisal:Excellent

PL/SQL procedure successfully completed.


请使用浏览器的分享功能分享到微信等