码迷,mamicode.com
首页 > 数据库 > 详细

PL/SQL

时间:2015-04-22 17:50:21      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

--使用引用变量
declare
ename CFACCDATA.ACC_OFFSET_FLAG_MAS.OFFSET_FLAG%type;
eid CFACCDATA.ACC_OFFSET_FLAG_MAS.ID_PK_SERIAL%TYPE;
begin

select OFFSET_FLAG, ID_PK_SERIAL
into ename, eid
from CFACCDATA.ACC_OFFSET_FLAG_MAS
where CFACCDATA.ACC_OFFSET_FLAG_MAS.OFFSET_FLAG_DES = ‘提取‘;

dbms_output.put_line(ename || ‘.........‘ || eid);

end;

--if语句
declare
pnum number(5) := 58;
begin
--判断
if pnum = 0 then
dbms_output.put_line(‘您输入的是0‘);
elsif pnum = 1 then
dbms_output.put_line(‘您输入的是1‘);
else
dbms_output.put_line(‘其他数字‘);
end if;
end;

--循环
/*
for 循环:可以跟子查询
pename emp.ename%type;
for pename in(select ename from emp)
loop



end loop;
*/

declare
pnum number := 1;
begin
loop
--退出条件
exit when pnum > 10;

--打印
dbms_output.put_line(pnum);

--加一
pnum := pnum + 1;
end loop;

end;
--使用光标(游标):诗意哦那个游标查询 并打印
--默认情况下,Oracle允许一次打开300个光标
declare
--定义光标
cursor cemp is
select OFFSET_FLAG from CFACCDATA.ACC_OFFSET_FLAG_MAS;
--为该光标定义变量
pename CFACCDATA.ACC_OFFSET_FLAG_MAS.OFFSET_FLAG%type;
begin
--打开光标
open cemp;
loop
--取每一条记录
--fetch:1 取值 2.把指针往后移动一个位置
fetch cemp
into pename;
--如果没有取道,退出循环
exit when cemp%notfound;

--打印
dbms_output.put_line(pename);

end loop;
--关闭
close cemp;
end;

/*
给员工涨工资:总裁 1000 经理800 其他400
可能用到的SQL、
select job,empno from emp;
update emp set sal = sal+? where=?
*/
set serveroutput on declare
--光标
cursor cemp is
select empno, empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
bgin rollback;

open cemp;
loop
--取每一个员工
fetch cemp
into pempno, pjob;
exit when cemp%notfound;
--判断
if pjob = ‘PRESIDENT‘ then
update emp set sal = sal + 1000 where empno = pempno;
elsif pjob = ‘MANAGER‘ then
update emp set sal = sal + 800 whre empno = pempno;
else
update emp set sal = sal + 400 where empno = pempno;
end if;

end loop;
close cemp;

--提交
commit;

dbms_output.put_line(‘完成‘);
end;

--带西安书的光标:查询10号部门的员工
set serveroutput on declare cursor cemp(dno number) is select ename, sal from emp where deptno = dno; pename emp.ename%type; psal emp.sal%type; begin open cemp(20); loop fetch cemp into pename, psal; exit when cemp%notfound;

dbms_output.put_line(pename || ‘的薪水是‘ || psal); end loop; close cemp; end;

--系统定义例外(被0除)
set serveroutput on declare pnum number; begin pnum := 1
/ 0; exception when zero_divide then dbms_output.put_line(‘被0除‘); end;

--自定义例外: no_emp_data_found
--问题: 如何保证close 一定会执行? 实现finally 功能
set serveroutput on declare
--自定义例外
no_emp_data_found exception;

--光标
cursor cemp is select ename from emp where deptno = 50; pename emp.ename%type; begin open cemp; fetch cemp into pename; if cemp%motfound then raise no_emp_data_found; end if;

close cemp; exception when no_emp_data_found then dbms_output.put_line(‘没有找到员工‘); end;

 

/*
实例1:统计每年入职的员工人数
可能用到的SQL
select to_char(hiredate,‘yyyy‘)from emp;
*/
set serveroutput on
declare
cursor cemp is select to_char(hiredate,‘yyyy‘)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%motfound;
--判断
if phiredate=‘1980‘ then count80 :=count80+1;
elsif phiredate=‘1981‘ then coun81 :=count81+1;
elsif phiredate=‘1982‘ then coun82 :=count82+1;
else count87 := count87+1;
end if;

end loop;
close cemp;


--输出
dbms_output.put_line(‘..............‘);

end;

/*
实例2:
为员工涨工资。从最底工资调起每人涨10%,
但工资总额不能超过6万元,请计算涨工资的人数和涨工资后的工资总额,
并输出涨工资人数及工资总额

可能的SQL:
select empno,sal emp order by sal;
工资总额;
方式一: select sum(sal) from emp;
方式二: 对sal求和
update emp set sal=sal*1.1 where empno=?

*/
set serveroutput on
declare
cursor cemp is select empno,sal from emp order by sal;
pempno emp.empno%type;
psal emp.sal%type;

--涨工资的人数
pcount number:=0;
--工资总额
psalTotal number;
begin
--初始化工资总额
select sum(sal) into psalTotal from emp;

open cemp;
loop
--第一个退出条件
exit when psalTotal > 5000;
fetch cemp into pempno,psal;
--第二个退出条件
exit when cemp%motfound;

--涨工资
update emp set sal=sal*1.1 where empno=pempno;
--人数加一
pcount := pcount+1;
--重新计算工资总额,原则,能不访问数据库,就不要访问数据哭
--方式一: select sum(sal) into psalotal from emp;
--方式二:
psalTotal := psalTotal+psal*0.1;
end loop;
close cemp;

--提交
commit;

dbms_output.put_line(‘人数‘||pcount||‘工资总额‘||psalTotal);
end;

/*
实例3:
用pl/sql语言编写一程序,实现按部门分段(6000以上,(6000,3000),3000元以下)
统计各工资段的职工人数,以及各部门的工资总额(工资总额中不包奖金)
部门
select deptno from dept;
部门中的员工
select sal from emp where deptno=?
部门的工资总额
select sum(sal) from emp where deptno=?
*/
set serveroutput on
declare
--部门
cursor cdept is select deptno from dept;
pdeptno 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;
--保存结果
insert into msg1 values(pdeptno,count1,count2,count3,nvl(saltotal,0));
commit;
end loop;
close cdept;

dbms_output.put_line(‘完成‘);
end;

 

PL/SQL

标签:

原文地址:http://www.cnblogs.com/chentaiyan/p/4448119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!