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语句是创造占位程序的一个方法。占位程序是一个假的子程序 (过程、函数),它可以帮助你推迟对子程序的定义或编写,直到调试完主程序为止。这样就不会因为编写细节二耽误其 他程序或主程序的开发。