3.循环结构:使用循环结构为所有员工加薪

declare
  --定义加薪比例常量
  c_manager   constant number :=0.15;
  c_salesman  constant number :=0.12;
  c_clerk     constant number :=0.10;
  v_job       varchar(100);             --定义职员变量
  v_empno     varchar(20);              --定义员工编号变量
  v_ename     varchar(60);              --定义员工名称变量
  cursor c_emp
  is
    select job,empno,ename
        from scott.emp
    for update;
  begin
    open c_emp;                         --打开游标
    loop                                --循环游标
      fetch c_emp
       into v_job,v_empno,v_ename;      --提取游标数据
      exit when c_emp%notfound;         --如果无数据可提取则退出游标
      if v_job='clerk'
        then                            --如果为职员,加薪10%
          update scott.emp
             set sal=sal*(1+c_clerk)
          where current of c_emp;
      elsif v_job='salesman'
      then                              --如果为销售职员,加薪12%
        update scott.emp
           set sal=sal*(1+c_salesman)
        where current of c_emp;
      elsif v_job='manager'
        then                            --如果为经理,加薪15%
          update scott.emp
             set sal=sal*(1+c_manager)
          where  current of c_emp;
      end if ;
      --显示完成信息
       dbms_output.put_line ('已经为员工'
                           ||v_empno
                           ||':'
                           ||v_ename
                           ||'成功加薪!'
                        );
  end loop;                              
  close c_emp;                           --关闭游标
exception
  when no_data_found
  then                                   --处理PL/SQL预定义异常
    dbms_output.out_line('没有找到员工数据');
end;
  

代码的执行流程如以下步骤所示:

(1)定义一个名为c_emp的游标,PL/SQL中的游标通常用来处理select语句返回的多行数据。

(2)为了提取游标指向的多行数据,在代码中使用了loop-end loop语法。循环调用fetch语句提取数据,exit when语句在无数据提取后,将退出循环。

(3)在提取到了数据后,通过分支结构根据员工的职级为员工进行了加薪,执行这个语句块后,可以看到再dbms_output输出区中显示了多行加薪成功的信息,表示循环已经成功执行。

实验内容 (一)掌握PL/SQL程序块结构,熟悉常量和变量的使用,掌握%TYPE、%ROWTYPE及记录类型的使用,掌握数据类型和流程控制语句,理解并掌握游标的创建与使用方法,熟悉异常处理。 1、写一段PL/SQL程序块,使用循环结构求得前10个自然数的积,并将中间过程每一步计算结果按照如下格式输出到屏幕上。将程序代码(截图1)和执行结果(截图2)截图。 输出格式: 第1次执行结果为:1 ................................... 第10次执行结果为:3628800 2、使用SQLDeveloper编写PL/SQL程序块,采用游标方式,调整scott.emp表中雇员信息的基本工资(字段名SAL)。如果该员工薪资小于等于2500,则在原基本工资基础上增加20%的薪资;如果该员工的薪资大于2500,则取消加薪。编写以上程序,输出每位员工的编号、姓名,加薪是否成功,如果加薪成功,输出加薪前和加薪后的工资;如果加薪失败,则输出原工资。请截图源程序(截图3)、控制台输出结果(截图4)、SQLDeveloper查看emp表数据结果(截图5)。 控制台输出格式如下: 编号:7654,姓名:MARTIN,加薪成功!原工资:1500,加薪后工资:1800 ......................................................................................................................... 编号:7839,姓名:KING,加薪失败!原工资:5000 (二)掌握存储过程的创建;熟悉掌握带参数的存储过程的使用;掌握函数的创建于执行;理解触发器的创建与执行;理解触发器的类型与作用;熟练掌握各种类型的触发器的创建与使用;掌握异常的处理。 1、创建存储过程DelEmployee,针对scott模式下的emp表,完成给定员工编号empno后(存储过程输入参数),删除该员工信息。注意:(1)当emp表中存在给定编号员工时,删除员工,并在控制台打印输出以下格式:编号为%empno%的员工已被删除;(2)当emp表中不存在该编号员工时,控制台打印输出以下格式:编号为%empno%的员工不存在,请重新输入! 在SQLDeveloper中编写以上功能,将存储过程源代码截图(截图6),同时使用匿名程序块调用该存储过程并截图(截图7),将执行结果截图(截图8)。 2、创建存储过程ProSumSalary,针对scott模式下的emp表,完成给定部门编号deptno后(输入参数),控制台输出该部门的所有员工的工资总和。注意:(1)当emp表中存在给定部门员工时,统计该部门的所有员工工资和,并在控制台打印输出以下格式:部门编号为%deptno%的员工工资总和为:%工资总和%;(2)当emp表中不存在该部门编号时,控制台打印输出以下格式:编号为%deptno%的部门不存在,请重新输入! 在SQLDeveloper中编写以上功能,将存储过程源代码截图(截图9),同时使用匿名程序块调用该存储过程,并将匿名程序块源码截图(截图10),将执行结果截图(截图11)。 3、创建函数实现上面2题的同样功能,思考体会存储过程与函数的异同点。创建函数FunSumSalary,针对scott模式下的emp表,完成给定部门编号deptno后(输入参数),返回该部门的所有员工的工资总和sumSal(函数返回值)。注意:(1)当emp表中存在给定部门员工时,统计该部门的所有员工工资和,并在控制台打印输出以下格式:部门编号为%deptno%的员工工资总和为:%工资总和%;(2)当emp表中不存在该部门编号时,控制台打印输出以下格式:编号为%deptno%的部门不存在,请重新输入! 在SQLDeveloper中编写以上功能,将函数源代码截图(截图12),同时使用匿名程序块调用该函数,并接收函数返回值,将匿名程序块源码截图(截图13),将执行结果截图(截图14)。 4、在scott模式下创建emp_logs表,表结构如表1 所示。创建触发器TrigEmpLogs完成以下功能,当从emp删除一条记录后,把被删除的员工编号、员工姓名、部门编号、删除时间记录在emp_logs表中。 在SQLDeveloper中编写以上功能,将触发器源代码截图(截图15),同时使用删除语句测试触发器执行效果,删除过程截图(截图16),查询删除后emp_logs表数据截图(截图17)。 表1 emp_logs表结构 字段名 类型 备注 empno varchar2(20) 非空
05-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值