Oracle数据库——PL/SQL程序设计综合案例

一、程序设计方法

1、瀑布模型

在这里插入图片描述

2、SQL 语句

3、变量:

  • 初始值是多少
  • 最终值如何得到

二、综合案例

1、综合案例1

统计每年入职的员工人数

/*
	SQL语句
		select to_char(hiredate,'yyyy') from emp; 
		-->光标-->循环-->退出条件: not found
	变量: 1.初始值: 2、如何得到:
	每年入职的员工人数:
	count80 number := 0;
	count81 number := 0;
	count82 number := 0;
	count87 number := 0;
*/
set serveroutput on

declare
	--定义光标
	cursor cemp is select to_char(hiredate,'yyy') from emp;
	phiredate varchar2(4) ;
	--定义每年入职的员工人数
	count80 number := 0;
	count81 number := 0;
	count82 number := 0;
	count87 number := 0;
begin
	open cemp;
	loop
		fetch cemp into phiredate; 
		exit when cemp%notfound;
		
		if phiredate = '1980' then count80 := count80+1;
		elsif phiredate = '1981' then count81 := count81+1;
		elsif phiredate = '1982' then count82 := count82+1;
		else count87 := count87+1; 
		end if;
	end loop;
	close cemp;
	dbms_output.put_line( 'total:'||(count80+count81+count82+count87));
	dbms_output.put_line('1980:'||count80) ;
	dbms_output.put_line('1981:'||count81) ;
	dbms_output.put_line('1982: '||count82) ;
	dbms_output.put_line('1987: '||count87) ;
end;
/

在这里插入图片描述

2、综合案例2

为员工涨工资。从最低工资涨起每人涨10%,但工资总额不能超过5万元,请计算涨工资的人数和涨工资后的工资总额,并输出涨工资人数及工资总额。

/*
SQL语句
select empno,sal from emp order by sal;
-->光标-->循环-->退出条件: 1.工资总额> 5W; 2、%notfound

变量: 1、初始值; 2、如何得到
涨工资的人数:
1、select sum(sal) into salTotal from emp;
2、涨后的工资总额=涨前的工资总额+sal*0.1
*/
set serveroutput on
declare
	--定义光标
	cursor cemp is select empno,sal from emp order by sal;
	pempno emp.empno%type;
	psal emp.sal%type;
	--涨工资的人数:
	countEmp number := 0;
	--涨后的工资总额:
	salTotal number;
begin
	--得到工资总额的初始值
	select sum(sal) into salTotal from emp;
	--打开光标
	open cemp;
	
	loop
	--1、工资总额> 5W
	exit when salTotal > 50000;
	--取一个员工涨工资
	fetch cemp into pempno, psal;
	--2、%notfound
	exit when cemp%notfound;
	
	--涨工资
	update emp set sal = sal*1.1 where empno = pempno;
	--人数+1
	countEmp := countEmp + 1;
	--涨后的工资总额=涨前的工资总额+sal*0.1
	salTotal := salTotal + psal*0.1;
	end loop;
	--关闭光标
	close cemp;
	commit;

dbms_output.put_line('人数: '||countEmp||' 涨后的工资总额: '||salTotal);
end;
/

在这里插入图片描述

3、综合案例3

用PL/SQL语言编写一段程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)

create table msg(
	deptno number,
	count1 number,
	count2 number,
	count3 number,
	saltotal number
);
/*
SQL语句
1.有哪些部门
	select deptno from dept-->光标-->循环-->退出条件: not found
2、部门中员工的薪水
	select sal from emp where deptno=? --> 带一个参数的光标--> 循环--> 退出条件: notfoun
	
count2 number;
count3 number;

每个部门的工资总额:
saltotal number;
1、 select sumsal) into saltotal from emp where deptno=???
*/
set serveroutput on
declare
	--部门的光标
	cursor cdept is select deptno from dept;
	pdeptno dept.deptno%type;
	
	--部门中员工的薪水
	cursor cemp(dno number) is select sal from emp where deptno = dno;
	psal emp.sal%type;
	
	--每个段的员工人数
	count1 number;
	count2 number;
	count3 number;
	
	--每个部门的工资总额
	saltotal number;
begin
	--打开部门的光标
	open cdept;
	loop
		--取出一个部门
    fetch cdept into pdeptno;
		exit when cdept%notfound;

		--初始化的工作
		count1:=0;count2:=0;count3:=0;
		--得到部门的工资总额:
		select sum(sal) into saltotal from emp where deptno=pdeptno;

		--取部门中员工的薪水
		open cemp(pdeptno);
		loop
			--取一个员工的薪水
			fetch cemp into psal;
			exit when cemp%notfound;
		
			--判断薪水的范围
			if psal<3000 then count1:=count1+1;
			elsif psal>=3000 and psal<6000 then count2:=count2+1;
			else count3:=count3+1;
			end if;
		end loop;
		close cemp;

		--保存当前部门的结果
		-- nv1();为虑空函数
		insert into msg values (pdeptno, count1, count2, count3, nvl(SALTOTAL,0));
	end loop;
	
	--关闭部门的光标
	close cdept;
	commit;
	dbms_output.put_line('统计完成');
end;
/

在这里插入图片描述
在这里插入图片描述

4、综合案例4

用PL/SQL语言编写一段程序。按系(系名)分段统计(成绩小于60分,60~85分,85分以上)“大学物理”课程各分数段的学生人数,及各系学生的平均成绩。

create table msg1 (
	coursename varchar2(20) ,
	dname varchar2(20) ,
	count1 number,
	count2 number ,
	count3 number ,
	avggrade number
);
/*
QL语句
1、得到有哪些系
	select dno, dname from dep;
	-->光标-->循环-->退出条件: not found
2、得到系中,选修了“大学物理”课程学生的成绩
	select grade from sc where cno=(select cno from course where cname-'大学物理')
							and sno in (select sno from student shere dno=??);
	-->带一个参数的光标--> 循环--> 退出条件: notfound

变量: 1.初始值2.如何得到
每个分数段的人数

每个系选修了“大学物理”学生的平均成绩:
avggrade number;
1、算术运算
2、select avg(grade) into avggrade from sc where cno=select cno from course whefe cname-'大学物理')
						and sno in (select sno trom student where dno=??);
*/
set serveroutput on
declare
	cursor cdept is select dno,dname from dep;
	pdno dep.dno%type;
	pdname dep.dname%type;
	--成绩光标
	cursor cgrade(coursename varchar2, depno number)
		is select grade from sc where cno=(select cno from course where cname=coursename)
							and sno in (select sno from student where dno=depno);
	pgrade sc.grade%type;
	--每个分段的人数
	count1 number; count2 number; count3 number;
	--每个系选修了“大学物理”学生的平均成绩
	avggrade number;
	--课程名称
	pcourseName varchar2(20) := '大学物理';
begin
	--打开系的光标
	open cdept; 
	loop
	--取出一个系的信息
	fetch cdept into pdno, pdname;
	exit when cdept%notfound;
	
	--初始化的工作
	count1:=0; count2:=0; count3:=0;
	--系的平均成绩
	select avg(grade) into avggrade from sc where cno=(select cno from course where cname=pcourseName)
		and sno in (select sno from student where dno=pdno);

	--取系中,选修了大学物理的学生成绩
	open cgrade (pcourseName, pdno);
	loop
		--取一个学生的成绩
		fetch cgrade into pgrade;
		exit when cgrade%notfound;

	--判断成绩的范围
	if pgrade<60 then count1 :=count1+1;
	elsif pgrade>=60 and pgrade<85 then count2 :=count2+1;
	else count3:=count3+1;
	end if;
	end loop;
	close cgrade;

	--保存当前的结果
	-- nv1();为虑空函数
	insert into msg1 values (pcourseName, pdno, count1, count2,count3, avggrade);
end loop;
	
	--关闭系的光标
	close cdept;
	dbms_output.put_line('统计完成');
end;
/

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨云21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值