PL/SQL 也算是一个编程语言,跟C一样面向过程,这就需要对每一步的工程非常清楚啊,需要有一个非常清晰思路,这样写出来的SQL程序不会容易出错,在每个关键环节写上注释,能增强程序的可读性,便于后续修改;
关于思路分析需要有一个瀑布模型:
简单的PL/SQL 程序,理清思路需求,不易犯错;
--需求按部门分段统计 薪资6000以上的员工 6000-3000 3000以下的员工人数,以及各个部门员工薪资的总和
/*
需要的SQL语句:select deptno from dept部门号,员工工资,select empno,sal from emo where deptno=?(获取当前部门的员工工资)
员工的总金额 saltotal = 当前员工工资累加;也可以调用select sum(sal) from emp where deptno = ?;
在PL/SQl程序中 少量的访问数据库获取数据和累加计算,当然后者可以提高我们的效率,又可以避免频繁操作影响系统的性能
原则:能不操作数据库,就不操作数据库;
初始值 count1 count2 count3 累计计算各个区间员工的人数;
循环2次 外循环是获取部门号,内循环获取员工表
*/
set serveroutput on
declare
--部门号光标
cursor cdept is select deptno from dept;
--员工薪水光标
cursor cemp(dno number) is select sal from emp where deptno = dno;
saltotal emp.sal%type;
psal emp.sal%type;
pno emp.empno%type;
count1 number;
count2 number;
count3 number;
begin
--开启第一个光标
open cdept;
loop
fetch cdept into pno;
exit when cdept %notfound;
count1:=0;
count2:=0;
count3:=0;
psal:=0;
saltotal:=0;
--开启第二个员工表光标获取员工的薪水
open cemp(pno);
loop
--循环开始
fetch cemp into psal;
exit when cemp %notfound;
saltotal:=saltotal+psal;
--条件判断
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;
--操作数据库的meg表
insert into meg values (pno,count1,count2,count3,saltotal);
end loop;
--关闭光标
close cdept;
--事务提交
commit;
dbms_output.put_line('数据输出结束');
end;
/