pl/sql案例

项目生命周期:

瀑布模型

拿到一个项目后,首先:分析需要用到的SQL语句;

其次:分析需要定义的变量初始值是多少,怎么得到最终值;

案例一:

统计每年入职的员工数量以及总数量:

  SQL语句:select to_char(hiredate,‘yyyy‘) from emp;--to_char(hiredate,‘yyyy‘) :hiredate原本的格式是yyyy-mm-dd但是我们只需要年份,则强制转换为char型,并且格式为yyyy,强制转换语法:to_                       目的类型(目标字段,格式)

需要遍历整个表,那么需要用到光标->循环->退出条件:%notfound

变量:phiredate varchar2(20)

计数器:

count80 number := 0;

count82 number := 0;

count87 number := 0;

count89 number := 0;

set serveroutput on;

declare

cursor c is select  to_char(hiredate,‘yyyy‘) from emp;--定义光标

phiredate varchar2(20);

count80 number := 0;

count82 number := 0;

count87 number := 0;

count89 number := 0;

begin

open c;--打开光标

loop

fetch c into phiredate ;--取出员工的入职年份

exit when c%notfound;--关闭循环的条件

if phiredate= ‘1980‘  then   count80 number := count80+ 1;

elsif  phiredate= ‘1982‘  then   count82 number := count82+ 1;

elsif  phiredate= ‘1987‘  then   count87 number := count87+ 1;

else     count87 number := count87+ 1;

end if;

end loop;

close c;

dbms_output.put_line(‘tatal:‘||count80+count82+count87+count89)

end;

/

案例二

  SQL语句:select no,sal from emp;

需要遍历整个表,那么需要用到光标->循环->退出条件:%notfound

变量:pno emp.no%type;

psal emp.sal%type;

涨工资人数:countemp number := 0;

涨后的工资总额:saltotal number;

select sum(sal) into saltotal from emp;

涨后的工资总额 = 涨前的工资总额 + sal*0.1;

set serveroutput on

declare

cursor c is select empno,sal from order by sal;

pno emp.no%type;

psal emp.sal%type;

countemp number := 0;--涨工资的人数

saltatol number;--涨后的工作总额

begin

select sum(sal) into saltatol from emp;--涨工资前的初始值

open c;

loop

exit when saltotal >50000;

fetch c into pno,psal;

exit when c%notfound;

update emp set sal := sal*1.1 where no = pno;--涨工资

countemp :=  countemp + 1;--人数+1

end loop;

close c;

commit;

dbms_output.out_put(‘人数= ‘||countepm||‘,涨后的工资总额:‘||saltatol);

end:

/

案例三

实现部门分段(6000分以上,6000》且3000《,3000以下)统计各工资段的职工人数,以及各部门的工资总额(不包括奖金)

首先需要创建存储结果的表msg:create table msg(deptno number;count1 number;count2 number;  count3 number;saltotal number);

set serveroutput on

declare

cursor cdept is select deptno from dept;--部门的光标

pdeptno dept.deptno %type;--部门光标对应的变量

cursor cemp(deptno) is select sal from emp where no = deptno;--部门工资的光标

psal emp.sal %type;--部门工资光标对应的变量

count1 number;count2 number;count3 number;--每个阶段员工计数器

begin

open cdept;

loop

fetch cdept into pdeptno;--取出一个部门

exit when cdepy%notfound;

count1 :=0;count2 :=0;count3 :=0;--初始化计数器

select sum(sal) into saltatol from emp where deptno = pdeptno;--计算部门工资总额

open cemp(pdeptno)

loop

fetch cemp into psal;--取出每一个员工的薪资

exit when cemp%noufound;

if psal <3000 then count1 := count1 +1;--判断工资范围

elsif  psal>6000 then count3 := count3 +1;

else count2 := count2 +1;

end if;

end loop;

close cemp;

insert into  msg value(pdeptno,count1,count2,count3,saltatol);--保存当前部门的结果

end loop;

close cdept;

end:

/

案例四

按照系分段统计(成绩小于60,大于85,中间段)课程为‘大学物理’各个分数段的学生人数,以及各系学生的平均成绩;

set serveroutput on

declare

cersor cdept is select dno ,dname from dep;

pdno dep.dno%type;

cursor cgrade(coursename varchar2,depno number) is select grade from sc where cno =  (select cno from course where cname = courname) and sno in (select sno from student where dno = depno)--成绩光标

pgrade sc.grade % type;

count1 number;count2 number;count3 number;--每个分数段人数计数器

avggrade number;--平均成绩

pcoursename varchar2 :=‘大学物理‘;

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 = courname) and sno in (select sno from student where dno = depno)

open cgrade (pcoursename,pdno);

loop

fetch cgrade into pgrade;

exit when cgrade %notfound;

if psal <60 then count1 := count1 +1;--判断工资范围

elsif  psal>85 then count3 := count3 +1;

else count2 := count2 +1;

end if;

end loop;

end loop;

close cgrade;

insert into msg value (pcoursename,count1,count2,count3,avggrade);

end loop;

close cdept;

commit;

dbms_output.put_line(‘统计完成‘);

end:/

时间: 2024-10-06 09:00:47

pl/sql案例的相关文章

PL/SQL重新编译包无反应案例2

在这篇"PL/SQL重新编译包无反应"里面介绍了编译包无反应的情况,今天又遇到一起案例, 在测试环境中,一个包的STATUS为INVALID,重新编译时,一直处于编译状态,检查发现下面两条因素都不存在: 1:当包正在被调用执行时,编译该包会导致无响应情况.     2:包中的对象或依赖对象被其它session所拥有. 后面检查发现包中调用了一个LINKED SERVER,由于迁移测试服务器,原服务器的IP地址变化了,导致LINKED SERVER已经无效了.所以出现了这种情况.重建了L

pl/sql练习案例

pl/sql练习案例 1,写匿名块,输入三角形三个边的长度.在控制台打印三角形的面积. declare--声明变量v_w number(8,2):=&三角形的底边;v_h number(8,2):=&三角形的高;v_s number(8,2);begin --计算面积 v_s:=(v_w*v_h)/2; --控制台输出 dbms_output.put_line('三角形的面积:'||v_s);end; 2,输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金) dec

PL/SQL中的变量案例解析

1.标量: ag1: declare v_ename emp.ename%type;--自己称为单变量 begin select ename into v_ename from emp where empno=&no; dbms_output.put_line('雇员名称'||v_ename); end; ag2: declare type test1 is record(t1 emp.ename%type,t2 emp.sal%type);--定义记录型变量 v_tt test1;--v_tt

百倍性能的PL/SQL优化案例(r11笔记第13天)

我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,""自黑""一下. 有一个真实想法和大家讨论一下,就是一个SQL语句如果原本运行20秒,优化到了1秒,性能提升该说是20倍还是提高了95%.当然还见过一种说法,一条SQL语句每次运行20秒,每天运行100次,优化后每次运行1秒,运行还是100次,那么性能提升是说成优化累计时间为100*20-100=1990秒? 好了,我们来看看PL/SQL的优

pl/sql编程基础

PL/SQL 1.过程.函数.触发器是pl/sql编写的 2.过程.函数.触发器是存放在oracle数据库中的 3.pl/sql是非常强大的过程化语言 4.过程.函数.触发器可以在java程序中调用 pl/sql编写能节省一点时间就是提高了性能(量大),java直接调用数据库存放的过程,解析时间就节省下来了,提高了性能 模块化的设计思想----->存储过程 网络传输(java程序中编写的sql语言),直接调用数据库的过程节省了传输量 提高安全性(存储过程避免了数据库信息的泄漏) 缺点: 移植性不

pl/sql乱码的问题

案例一: 使用的是服务器上的,不是本机的Oracle,按下面做就可以了: 设置环境变量:NLS_LANG,具体值用下面查询的值: select userenv('language') from dual; 或者 SELECT 'AMERICAN_AMERICA.' || PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'NLS_CHARACTERSET';    假如服务器的是:AMERICAN_AMERICA.ZHS1

oracle 学习笔记之PL/SQL程序设计

1.PL/SQL的定义: PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循环等),使SQL语言具有过程处理能力. 把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单.高效.灵活和实用. Plsql(oracle),Transact-sql(SQL server) 2.入门程序-->打印hello world; set serverout

Oracle PL/SQL随堂笔记总结

1.pl/sql编程 1.理解oracle的pl/sql的概念    2.掌握pl/sql编程技术(过程.函数.触发器)    pl/sql是标准sql语句的扩展    简介        1.过程.函数.触发器都是由pl/sql编写        2.过程.函数.触发器是在oracle中        3.pl/sql是非常强大的过程语言        4.过程.函数等可以在java程序被调用    学习必要性:        1.提高应用程序的性能        2.模块化的设计思想    

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(