这里主要讲下分支判断结构。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.
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.
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.
例子:
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.