-----------------条件判断:根据条件是否为真,执行相应的操作
1、IF ELSE 判断
2、CASE WHEN 判断
-----------IF ELSE 条件判断
--语法结构:
DECLARE
--声明体
BEGIN
--逻辑体
IF 条件1 THEN 逻辑1;
[ELSIF 条件2 THEN 逻辑2;
ELSIF 条件3 THEN 逻辑3;
.
.
.
ELSE 其它逻辑;]
END IF;
END;
--需要注意的是:
1、END IF; 后面的分号不要忘
2、每写完一个逻辑(then后面的内容),都有一个分号表示结束
3、IF ELSE 条件判断只能对变量进行判断,不能对表里面的列进行判断
意思就是:不能像之前学的case when一样作为查询的信息放在select后面
4、走IF后面为真的逻辑,如果多个if后面为真,那么走最先的那条
5、要先理解清楚判断的对象是什么,条件是什么,条件是否完整,以及then后面是要做什么操作
--比如:输入两个数字,打印较大的那个数,如果一样大,则打印hello world
DECLARE
X NUMBER := &输入一个数字X;
Y NUMBER := &输入一个数字Y;
Z CONSTANT VARCHAR2(15) := 'HELLO WORLD';
BEGIN
IF X > Y THEN
DBMS_OUTPUT.PUT_LINE(X);
ELSIF X < Y THEN
DBMS_OUTPUT.PUT_LINE(Y);
ELSE
DBMS_OUTPUT.PUT_LINE(Z);
END IF;
END;
/*小练习一把:输入员工编号,查询该员工的工资,如果工资大于1500,则加薪2000,
如果工资大于900,则加薪3000,
否则加薪1000
打印该员工的编号,姓名,工资,加薪后的工资*/
DECLARE
V_EMPNO NUMBER := &输入一个员工编号;
V_SAL NUMBER(7, 2);
V_ENAME VARCHAR2(10);
V_NEWSAL NUMBER;
BEGIN
--通过隐式游标将查询到的结果分别赋值给不同的变量
SELECT E.ENAME, E.SAL
INTO V_ENAME, V_SAL
FROM EMP E
WHERE E.EMPNO = V_EMPNO;
--然后,再对这个变量的值进行判断,执行不同的操作
IF V_SAL > 1500 THEN
V_NEWSAL := V_SAL + 2000;
ELSIF V_SAL > 900 AND V_SAL <= 1500 THEN
V_NEWSAL := V_SAL + 3000;
ELSE
V_NEWSAL := V_SAL + 1000; --一个赋值语句是一句话,如果还有其他的,不能用and连接,而是多句话来写
END IF;
DBMS_OUTPUT.PUT_LINE('编号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 工资:' ||
V_SAL || ' 加薪后的工资:' || V_NEWSAL);
END;
/*小练习一把:输入员工编号,查询该员工的工资,如果工资大于1500,则奖金加2000,
如果工资大于900,则奖金加3000,
否则奖金加1000
打印该员工的编号,姓名,工资,奖金,新的奖金
如果员工编号不存在,则打印“该员工不存在,请重新输入一个员工编号”*/
DECLARE
V_EMPNO NUMBER := &输入一个员工编号;
V_ENAME VARCHAR2(10);
V_SAL NUMBER(7, 2);
V_COMM NUMBER(7, 2);
V_NEWCOMM NUMBER;
CT NUMBER; ---来判断员工是否存在
BEGIN
SELECT COUNT(*) INTO CT FROM EMP WHERE EMPNO = V_EMPNO;
IF CT = 0 THEN
DBMS_OUTPUT.PUT_LINE('该员工不存在,请重新输入一个员工编号');
ELSE --相当于 CT = 1
SELECT ENAME, SAL, NVL(COMM, 0)
INTO V_ENAME, V_SAL, V_COMM
FROM EMP
WHERE EMPNO = V_EMPNO;
IF V_SAL > 1500 THEN
V_NEWCOMM := V_COMM + 2000;
ELSIF V_SAL > 900 AND V_SAL <= 1500 THEN
V_NEWCOMM := V_COMM + 3000;
ELSE
V_NEWCOMM := V_COMM + 1000;
END IF;
DBMS_OUTPUT.PUT_LINE('编号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 工资:' ||
V_SAL || ' 奖金:' || V_COMM || ' 新的奖金:' ||
V_NEWCOMM);
END IF;
END;
--如果有多个判断的时候,看他们之间是否有前后的依赖关系(是否需要先判断出来一个,再根据判断的结果去判断另外一个)
-----------------回顾一下之前学的列上的判断:case when
/*小练习一把:输入员工编号,查询该员工的工资,如果工资大于1500,则加薪2000,
如果工资大于900,则加薪3000,
否则加薪1000
打印该员工的编号,姓名,工资,加薪后的工资*/
DECLARE
V_EMPNO NUMBER := &输入一个员工编号;
V_SAL NUMBER(7, 2);
V_ENAME VARCHAR2(10);
V_NEWSAL NUMBER;
BEGIN
SELECT E.ENAME,
E.SAL,
CASE
WHEN E.SAL > 1500 THEN
E.SAL + 2000
WHEN E.SAL > 900 AND E.SAL <= 1500 THEN
E.SAL + 3000
ELSE
E.SAL + 1000
END AS NEWSAL
INTO V_ENAME, V_SAL, V_NEWSAL
FROM EMP E
WHERE E.EMPNO = V_EMPNO;
DBMS_OUTPUT.PUT_LINE('编号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 工资:' ||
V_SAL || ' 加薪后的工资:' || V_NEWSAL);
END;
/*小练习一把:分别用if else 和列上的判断case when 实现:输入一个员工编号,根据员工的部门给员工加薪
部门10加5000
部门20加3000
否则加50%
打印员工的编号,姓名,部门编号,工资,加薪后的工资*/
--IF ELSE 条件判断
DECLARE
V_EMPNO NUMBER(4) := &输入一个员工编号;
V_DEPTNO NUMBER(2);
V_ENAME VARCHAR2(10);
V_SAL NUMBER(7, 2);
V_NEWSAL NUMBER(7, 2);
BEGIN
SELECT ENAME, DEPTNO, SAL
INTO V_ENAME, V_DEPTNO, V_SAL
FROM EMP
WHERE EMPNO = V_EMPNO;
IF V_DEPTNO = 10 THEN
V_NEWSAL := V_SAL + 5000;
ELSIF V_DEPTNO = 20 THEN
V_NEWSAL := V_SAL + 3000;
ELSE
V_NEWSAL := V_SAL * 1.5;
END IF;
DBMS_OUTPUT.PUT_LINE('编号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 部门编号:' ||
V_DEPTNO || ' 工资:' || V_SAL || ' 加薪后的工资:' ||
V_NEWSAL);
END;
--case when 列上的判断
DECLARE
V_EMPNO NUMBER(4) := &输入一个员工编号;
V_DEPTNO NUMBER(2);
V_ENAME VARCHAR2(10);
V_SAL NUMBER(7, 2);
V_NEWSAL NUMBER(7, 2);
BEGIN
SELECT ENAME, DEPTNO, SAL,
CASE DEPTNO
WHEN 10 THEN E.SAL + 5000
WHEN 20 THEN E.SAL + 3000
ELSE E.SAL * 1.5
END AS NEW_SAL
INTO V_ENAME, V_DEPTNO, V_SAL,V_NEWSAL
FROM EMP E
WHERE EMPNO = V_EMPNO;
DBMS_OUTPUT.PUT_LINE('编号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 部门编号:' ||
V_DEPTNO || ' 工资:' || V_SAL || ' 加薪后的工资:' ||
V_NEWSAL);
END;
----------CASE WHEN条件判断
多分支条件判断,在语法结构上跟if else很相似
--语法结构:
DECLARE
--声明的部分
BEGIN
--逻辑体
CASE
WHEN 条件1 THEN 逻辑1;
[WHEN 条件2 THEN 逻辑2;
.
.
.
ELSE 其他逻辑;]
END CASE;
END;
--需要注意的是:
1、区别于之前学的case when列上的判断
2、这里的case WHEN 条件判断只能对变量做判断
3、不要忘记最后的end case以及它后面的分号
4、不要忘记每一句逻辑体后的分号
/*比如:输入员工编号,查询该员工的工资,如果工资大于1500,则加薪2000,
如果工资大于900,则加薪3000,
否则加薪1000
打印该员工的编号,姓名,工资,加薪后的工资*/
DECLARE
V_EMPNO NUMBER(4) := &输入一个员工编号;
V_ENAME VARCHAR2(10);
V_SAL NUMBER(7, 2);
V_NEWSAL NUMBER(7, 2);
BEGIN
SELECT E.ENAME, E.SAL
INTO V_ENAME, V_SAL
FROM EMP E
WHERE E.EMPNO = V_EMPNO;
CASE
WHEN V_SAL > 1500 THEN
V_NEWSAL := V_SAL + 2000;
WHEN V_SAL > 900 AND V_SAL <= 1500 THEN
V_NEWSAL := V_SAL + 3000;
ELSE
V_NEWSAL := V_SAL + 1000;
END CASE;
DBMS_OUTPUT.PUT_LINE('工号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 工资:' ||
V_SAL || ' 加薪后的工资:' || V_NEWSAL);
END;
--相对来说,IF ELSE条件判断用的居多
/*小练习一把:输入一个员工表编号,根据该员工的工资等级给员工加薪
等级为1的,加10000
等级为2的,加8000
等级为3的,加6000
其他的,加5000
打印员工的工号,姓名,工资等级,工资,加薪后的工资
(用case when条件判断实现)*/
DECLARE
V_EMPNO NUMBER(4) := &输入一个员工编号;
V_ENAME VARCHAR2(10);
V_GRADE NUMBER(2);
V_SAL NUMBER;
V_NEWSAL NUMBER;
BEGIN
SELECT E.ENAME, E.SAL, S.GRADE
INTO V_ENAME, V_SAL, V_GRADE
FROM EMP E
JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE E.EMPNO = V_EMPNO;
CASE
WHEN V_GRADE = 1 THEN
V_NEWSAL := V_SAL + 10000;
WHEN V_GRADE = 2 THEN
V_NEWSAL := V_SAL + 8000;
WHEN V_GRADE = 3 THEN
V_NEWSAL := V_SAL + 6000;
ELSE
V_NEWSAL := V_SAL + 5000;
END CASE;
/*IF V_GRADE = 1 THEN
V_NEWSAL := V_SAL + 10000;
ELSIF V_GRADE = 2 THEN
V_NEWSAL := V_SAL + 8000;
ELSIF V_GRADE = 3 THEN
V_NEWSAL := V_SAL + 6000;
ELSE
V_NEWSAL := V_SAL + 5000;
END IF;
*/
DBMS_OUTPUT.PUT_LINE('编号:' || V_EMPNO || ' 姓名:' || V_ENAME || ' 工资:' ||
V_SAL || ' 工资等级:' || V_GRADE || ' 加薪后的工资:' ||
V_NEWSAL);
END;