存储过程和游标

创建一个存储过程:
如果JOB是PRESIDENT,则SAL加1%;
如果JOB是MANAGER,则SAL加5%;
如果JOB是ANALYST则SAL加10%
如果JOB是SALESMAN则SAL加20%
如果JOB是都不是以上类别则SAL加15%
并且要输出它们的ENAME,JOB ,进入公司的天数
用游标累计叠加计算每个部门所需要支付的薪水,输出 DEPTNO,所支付的薪水

set serveroutput on;
create or replace procedure emp_job (aaa number)
as
var_days number;
var_xinzi number:=0;
cursor cur_emp is select empno,ename,job,hiredate,sal,deptno from scott.emp where deptno=aaa;
begin
for xuhuang in cur_emp loop
if xuhuang.job='PRESIDENT' then
xuhuang.sal:=xuhuang.sal*1.01;
elsif xuhuang.job='MANAGER' then
xuhuang.sal:=xuhuang.sal*1.05;
elsif xuhuang.job='ANALYST' then
xuhuang.sal:=xuhuang.sal*1.1;
elsif xuhuang.job='SALESMAN' then
xuhuang.sal:=xuhuang.sal*1.2;
else xuhuang.sal:=xuhuang.sal*1.15;
end if;
update emp set sal=xuhuang.sal where empno=xuhuang.empno;
commit;
var_xinzi:=var_xinzi+xuhuang.sal;
var_days:=trunc(sysdate,'j')-trunc(xuhuang.hiredate,'j');
dbms_output.put_line('姓名:'||xuhuang.ename||' 工作:'||xuhuang.job||' 薪资:'||xuhuang.sal||' 入职天数:'||var_days);
end loop;
dbms_output.put_line('部门号:'||aaa||' 需要支付的薪资:'||var_xinzi);
end;

SQL> set serveroutput on;
SQL> exec emp_job(20);

姓名:SMITH 工作:CLERK 薪资:1058 入职天数:13067
姓名:JONES 工作:MANAGER 薪资:3279.94 入职天数:12961
姓名:SCOTT 工作:ANALYST 薪资:3630 入职天数:10753
姓名:ADAMS 工作:CLERK 薪资:1454.75 入职天数:10719
姓名:FORD 工作:ANALYST 薪资:3630 入职天数:12716
部门号:20 需要支付的薪资:13052.69

PL/SQL procedure successfully completed

SQL>

原文地址:https://www.cnblogs.com/feng666666/p/5908615.html