pl/sql---流程化控制语句

流程化控制语句——条件语句

又称选择语句,它的主要作用是根据条件的变化选择执行不同的代码
它包括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;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值