标签:
--使用引用变量
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;
标签:
原文地址:http://www.cnblogs.com/chentaiyan/p/4448119.html