PL/SQL流程控制结构包括:条件控制、循环控制、顺序控制。
条件控制
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; /
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; /
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; /
循环控制
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; /
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; /
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语句是一条无条件跳转语句,它能实现语句从一处无条件地跳转到一个用标签指定的另一条可执行语句处或一个 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语句的作用是提高程序的可读性,保证其他语句结构的完整性、正确性。如,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语句是创造占位程序的一个方法。占位程序是一个假的子程序 (过程、函数),它可以帮助你推迟对子程序的定义或编写,直到调试完主程序为止。这样就不会因为编写细节二耽误其 他程序或主程序的开发。