天天看点

oralce plsql案例练习

以下plsql程序用的scott用户的dept,emp表。

案例1

1 --查询80,81,82,87年员工入职人数
 2 set serveroutput on
 3 declare
 4 
 5   cursor cemp is select to_char(hiredate,'yyyy') from emp; 
 6   count80 number :=0;
 7   count81 number :=0;
 8   count82 number  :=0;
 9   count87 number  :=0;
10   phiredate varchar2(4) := '';
11   
12 begin
13   open cemp;
14   
15   loop
16     fetch cemp into phiredate ;
17     exit when cemp%notfound;
18     
19     if phiredate = '1980' then  count80 := count80 +1;
20     elsif phiredate = '1981' then  count81 := count81 +1;
21     elsif phiredate = '1982' then  count82 := count82 +1;
22     elsif phiredate = '1987' then  count87 := count87 +1;
23     end if;
24     
25   end loop;
26   close cemp;
27   
28   dbms_output.put_line('total:'||(count80+count81+count82+count87));
29   dbms_output.put_line('1980:'||(count80 ));
30   dbms_output.put_line('1981:'||(count81));
31   dbms_output.put_line('1982:'||(count82));
32   dbms_output.put_line('1987:'||(count87));
33   
34 end;
35 /      

案例2

1 --员工涨工资。从最低工资涨起每人涨10%,但是所有员工的工资总额不能超过5万元,请计算涨工资的人数和涨工资后的所有员工的工资总额
 2 
 3 
 4 set serveroutput on
 5 
 6 declare
 7 
 8 --定义光标:查询所有员工的员工号和工资
 9   cursor cemp is select empno,sal from emp order by sal;
10   pempno emp.empno%type;
11   psal emp.sal%type;
12   
13   countEmp number := 0;
14   salTotal emp.sal%type;
15   
16   begin
17   --查询所有员工涨前的工资总额
18     select sum(sal)  into salTotal from emp;
19   
20   open cemp;
21   loop
22   --涨前工资综合大于5000则退出循环
23     exit when salTotal > 50000 ;
24     
25     fetch cemp into pempno,psal;
26     
27     --若未从光标中取到值退出循环
28     exit when cemp%notfound;
29     
30     --若当前的工资总额加上 当前员工涨后的工资大于5万则退出循环
31     exit when salTotal +psal*0.1 >50000;
32     
33     update emp set sal = sal*1.1 where empno = pempno;
34   
35     countEmp := countEmp +1;
36     salTotal :=salTotal +psal*0.1;
37   
38   end loop;
39   close cemp;
40   commit;
41   
42   dbms_output.put_line('涨工资的人数是:'||countEmp);
43   dbms_output.put_line('涨后的工资总额是:'||salTotal);
44   
45   
46   end;
47   /      

案例3:

1 --实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各个工资段的职工人数、以及各部门的工资总额
 2 
 3 set serveroutput on
 4 
 5 declare 
 6 
 7     cursor cdept is select deptno from dept;
 8     pdeptno dept.deptno%type;
 9   
10     cursor cemp(dno number )  is select deptno,sal from emp where deptno = dno;
11     pdno emp.deptno%type;
12     psal emp.sal%type; 
13   
14     count1 number := 0;
15     count2 number := 0;
16     count3 number := 0;
17     saltotal number := 0;
18 
19 begin
20 
21     open cdept;
22     
23     loop
24         fetch cdept into pdeptno ;
25         exit when cdept%notfound;
26     
27         open cemp(pdeptno);
28          saltotal := 0;
29          count1 := 0;
30          count2 := 0;
31          count3 :=0;
32         loop
33             fetch cemp into pdno,psal;
34             exit when cemp%notfound;
35            
36             if psal < 3000 then count1 :=count1+1;
37             elsif psal <= 6000 then count2:=count2+1;
38             elsif psal > 6000 then count3 := count3 +1;
39             end if;
40             saltotal := saltotal +psal;
41         end loop;
42         close cemp;
43         insert into msg values(pdno,count1,count2,count3,saltotal);
44   end loop;
45 
46 
47   close cdept;
48   
49   commit;
50 end;
51 /      

案例出处:http://www.imooc.com/learn/360