流程化控制语句——条件语句
又称选择语句,它的主要作用是根据条件的变化选择执行不同的代码
它包括IF语句和CASE语句。
1.IF语句
### 1)IF...THEN..
IF 条件 THEN
语句 ----如果条件为真,执行语句,否则退出
END IF;
/
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := 'SMITH'; --定义变量,以便在语句主体中使用
BEGIN
--查询史密斯的工资和提成,然后保存到变量中
SELECT sal, NVL(comm,0) INTO v_sal, v_comm FROM emp1 WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN ---NVL()函数写在上面或者下面,结果一样
--如果条件成立则执行薪资更新工作
UPDATE emp1 SET sal = sal * 1.12 WHERE ename = v_ename;
END IF;
--使用游标变量判断是否成功的进行了更新
IF SQL%NOTFOUND THEN
--如果没有更新成功,则显示提示信息
DBMS_OUTPUT.put_line('没有对史密斯进行薪资调整的动作。');
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对史密斯调薪的操作失败,错误信息为:' || SQLERRM);
END;
/
SELECT * FROM EMP1;
/
2)IF…THEN…ELSE
IF 条件 THEN
语句1 ----条件为真,执行语句1
ELSE
语句2 -----条件为假,执行语句2
END IF;
/
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '&NAME'; --定义变量,以便在语句主体中使用
BEGIN
--查询老板的工资和提成,然后保存到变量中
SELECT sal, NVL(comm,0) INTO v_sal, v_comm FROM emp1 WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN ---NVL()函数写在上面或者下面,结果一样
--如果条件成立则执行薪资更新工作
UPDATE emp1 SET sal = sal * 1.12 WHERE ename = v_ename;
ELSE
--如果不条件成立则执行以下语句
UPDATE emp1 SET sal = sal + 200 WHERE ename = v_ename;
END IF;
--使用游标变量判断是否成功的进行了更新
IF SQL%NOTFOUND THEN
--如果没有更新成功,则显示提示信息
DBMS_OUTPUT.put_line('没有对老板进行薪资调整的动作。');
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对老板调薪的操作失败,错误信息为:' || SQLERRM);
END;
/
3)IF…THEN…ELSIF
IF 条件1 THEN
语句1 ----条件1为真,执行语句1,不为真,则往下判断条件2
ELSIF 条件2 THEN
语句2 -----条件2为真,执行语句2,不为真,则往下判断条件3
ELSIF 条件3 THEN
语句3 ------条件3为真,执行语句3,不为真,则往下判断条件
.
.
.
ELSE
语句n ----若条件都不满足则执行语句n
END IF;
/
DECLARE
v_sal NUMBER;
v_comm NUMBER;
v_ename VARCHAR2(20) := '&NAME'; --定义变量,以便在语句主体中使用
BEGIN
--查询XX的工资和提成,然后保存到变量中
SELECT sal, NVL(comm,0) INTO v_sal, v_comm FROM emp1 WHERE ename = v_ename;
--使用IF..THEN..END IF语句来判断工资是否大于3000
IF v_sal + v_comm < 3000 THEN ---NVL()函数写在上面或者下面,结果一样
--如果条件成立则执行薪资更新工作
UPDATE emp1 SET sal = sal * 1.12 WHERE ename = v_ename;
ELSIF v_sal + v_comm >= 3000 AND v_sal + v_comm < 4000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp1 SET sal = sal * 1.11 WHERE ename = v_ename;
ELSIF v_sal + v_comm >= 4000 AND v_sal + v_comm < 5000 THEN
--如果条件成立则执行薪资更新工作
UPDATE emp1 SET sal = sal * 1.10 WHERE ename = v_ename;
ELSE
---如果上述条件都不成立,执行下面语句
UPDATE emp1 SET sal = sal * 1.05 WHERE ename = v_ename;
END IF;
--使用游标变量判断是否成功的进行了更新
IF SQL%NOTFOUND THEN
--如果没有更新成功,则显示提示信息
DBMS_OUTPUT.put_line('没有对'||V_ENAME||'进行薪资调整的动作。');
END IF;
EXCEPTION
--处理NO_DATA_FOUND异常
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('对'||V_ENAME||'调薪的操作失败,错误信息为:' || SQLERRM);
END;
2.CASE语句
CASE 表达式
WHEN 语句1 THEN ---如果表达式=语句1,执行结果1
结果1
WHEN 语句2 THEN ---如果表达式=语句2,执行结果2
结果2
WHEN 语句3 THEN ---如果表达式=语句3,执行结果3
结果3
.
.
.
ELSE
结果n ----如果以上条件都不满足表达式,则执行结果n
END CASE;
DECLARE
V_VALUE VARCHAR2(30):=UPPER('&VALUE');
BEGIN
CASE V_VALUE
WHEN 'A' THEN
DBMS_OUTPUT.PUT_LINE('优秀');
WHEN 'B' THEN
DBMS_OUTPUT.PUT_LINE('良好');
WHEN 'C' THEN
DBMS_OUTPUT.PUT_LINE('及格');
WHEN 'D' THEN
DBMS_OUTPUT.PUT_LINE('较弱');
ELSE
DBMS_OUTPUT.PUT_LINE('请输入正确的值');
END CASE;
END;
/
DECLARE
V_VALUE VARCHAR2(30):=UPPER('&VALUE');
BEGIN
CASE
WHEN V_VALUE='A' THEN
DBMS_OUTPUT.PUT_LINE('优秀');
WHEN V_VALUE='B' THEN
DBMS_OUTPUT.PUT_LINE('良好');
WHEN V_VALUE='C' THEN
DBMS_OUTPUT.PUT_LINE('及格');
WHEN V_VALUE='D' THEN
DBMS_OUTPUT.PUT_LINE('较弱');
ELSE
DBMS_OUTPUT.PUT_LINE('请输入正确的值');
END CASE;
END;
SELECT * FROM EMP1;
---判断指定员工是否在职,若在职,辞退,否则,不作处理
---辞退的员工,打印:员工xx(姓名)被辞退
DECLARE
V_EMPNO NUMBER :=&请输入工号;
V_ENAME VARCHAR2(20);
V_CT NUMBER;
BEGIN
SELECT COUNT(1) INTO V_CT FROM EMP1 WHERE EMPNO=V_EMPNO;
IF V_CT=1 THEN
SELECT ENAME INTO V_ENAME FROM EMP1 WHERE EMPNO=V_EMPNO;
DELETE FROM EMP1 WHERE EMPNO=V_EMPNO;
COMMIT;
DBMS_OUTPUT.put_line('员工'||V_ENAME||'被辞退');
END IF;
END;
SELECT COUNT(1) FROM DEPT WHERE DEPTNO=50;
SELECT * FROM EMP1;
DECLARE
V_DEPTNO NUMBER :=&请输入部门编号;
V_CT NUMBER;
BEGIN
SELECT COUNT(1) CT INTO V_CT FROM DEPT WHERE DEPTNO=V_DEPTNO;
IF V_CT =1 THEN
SELECT COUNT(1) CT INTO V_CT FROM EMP WHERE DEPTNO=V_DEPTNO;
IF V_CT>0 THEN
DELETE FROM EMP_0419 WHERE DEPTNO=V_DEPTNO;
COMMIT;
DBMS_OUTPUT.put_line(V_DEPTNO||'已整体辞退');
ELSE
DBMS_OUTPUT.put_line(V_DEPTNO||'没有员工');
END IF;
ELSE
DBMS_OUTPUT.put_line(V_DEPTNO||'不存在');
END IF;
END;
/
DECLARE
V_DEPTNO NUMBER :=&请输入部门编号;
V_CT1 NUMBER;
V_CT2 NUMBER;
BEGIN
SELECT COUNT(1) INTO V_CT1 FROM DEPT WHERE DEPTNO=V_DEPTNO;
SELECT COUNT(1) INTO V_CT2 FROM EMP WHERE DEPTNO=V_DEPTNO;
IF V_CT1 =1 AND V_CT2>0 THEN
DELETE FROM EMP_0419 WHERE DEPTNO=V_DEPTNO;
COMMIT;
DBMS_OUTPUT.put_line(V_DEPTNO||'已整体辞退');
ELSIF V_CT1 =1 AND V_CT2=0 THEN
DBMS_OUTPUT.put_line(V_DEPTNO||'没有员工');
ELSE
DBMS_OUTPUT.put_line(V_DEPTNO||'不存在');
END IF;
END;