1.什么是存储过程:
事先运用oracle语法,写好的一段具有业务功能的程序版段,长期保存在oracle服务器中,供oracle客户端(sqlplus)和程序语言远程访问
2.为什么要使用存储过程:
- pl/sql一般语句每次执行都要整体运行一遍,才有结果
- pl/sql不能将其封装起来,长期保存在oracle服务器中
- pl/sql不能被其他应用程序调用,如java
优点:存储过程存储在数据库的服务器中,应用程序使用时只需要调用即可,存储过程只在创建时进行编译,以后每次执行存储过程,不需要再重新编译,而一般sql语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
3.创建结构:
4.删除:
drop procedure 存储过程名
5.调用:
- plsql语句中:
begin
存储过程名;
end;
- 命令提示符中
execute 存储过程名;
6.案例(无参)---有参的存储过程见下一篇文章
- 无参案例:
使用存储过程,在部门表中部门编号为10,30的所有员工中,对奖金为0或空的员工,奖金变为工资的40%, 对奖金不为空的,奖金增加10%(原奖金的1.1倍) 同时记录奖金变更的时间,原奖金,新奖金,员工编号,员工姓名(需要创建日志表)
//题中要用到日志表,那么先把准备工作做好,把表创好
create table rz(
da date,
oldcomm number(10),
newcomm number(10),
empno number(10),
ename varchar2(20));
//下面正式开始做题
create or replace procedure emp_upcomm
as
voldcomm number(10);
vnewcomm number(10);
vsal number(10);
vno number(10);
vname varchar2(20);
//因为要取emp多行的数据,则必须要创建游标进行取多行数据
cursor c is select empno,ename,comm,sal from emp where deptno in(10,30);
begin
open c;
loop
fetch c into vno,vname,voldcomm,vsal;
exit when c%notfound;
if voldcomm is null or voldcomm=0 then
vnewcomm:=vsal*0.4;
update emp set comm=vnewcomm where empno=vno;
insert into rz values
(sysdate,voldcomm,vnewcomm,vno,vname);
else
vnewcomm:=voldcomm*1.1;
update emp set comm=vnewcomm where empno=vno;
insert into rz values
(sysdate,voldcomm,vnewcomm,vno,vname);
end if;
end loop;
close c;
end;
//开始调用
begin
emp_upcomm //存储过程名
end;
//验证
select * fromm emp //看emp有没有更新
select * from rz //看日志表中是否记录了数据
- 验证展示结果:
select*from emp
select*from rz