在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器。在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的。相对来说,数据库系统中的触发器也是一种存储过程。存储过程在数据库中运算时自动生成各种执行方式,因此,大大提高了对其运行时的执行速度。在大型数据库系统如Oracle、SQL Server中都不仅提供了用户自定义存储过程的功能,同时也提供了许多可作为工具进行调用的系统自带存储过程。
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。
Oracle存储过程可以有无参数存储过程和带参数存储过程。
一、无参程序过程语法
1
create
or
replace
procedure
NoParPro
2 as ;
3 begin
4 ;
5 exception //存储过程异常
6 ;
7 end ;
8
2 as ;
3 begin
4 ;
5 exception //存储过程异常
6 ;
7 end ;
8
二、带参存储过程实例
1
create
or
replace
procedure
queryempname(sfindno emp.empno
%
type)
as
2 sName emp.ename % type;
3 sjob emp.job % type;
4 begin
5 ....
7 exception
....
14 end ;
15
2 sName emp.ename % type;
3 sjob emp.job % type;
4 begin
5 ....
7 exception
....
14 end ;
15
三、 带参数存储过程含赋值方式
1
create
or
replace
procedure
runbyparmeters (isal
in
emp.sal
%
type,
sname out varchar ,sjob in out varchar )
2 as icount number ;
3 begin
4 select count ( * ) into icount from emp where sal > isal and job = sjob;
5 if icount = 1 then
6 ....
9 else
10 ....
12 end if ;
13 exception
14 when too_many_rows then
15 DBMS_OUTPUT.PUT_LINE( ' 返回值多于1行 ' );
16 when others then
17 DBMS_OUTPUT.PUT_LINE( ' 在RUNBYPARMETERS过程中出错! ' );
18 end ;
19
sname out varchar ,sjob in out varchar )
2 as icount number ;
3 begin
4 select count ( * ) into icount from emp where sal > isal and job = sjob;
5 if icount = 1 then
6 ....
9 else
10 ....
12 end if ;
13 exception
14 when too_many_rows then
15 DBMS_OUTPUT.PUT_LINE( ' 返回值多于1行 ' );
16 when others then
17 DBMS_OUTPUT.PUT_LINE( ' 在RUNBYPARMETERS过程中出错! ' );
18 end ;
19
四、在Oracle中对存储过程的调用
过程调用方式一
1
declare
2 realsal emp.sal % type;
3 realname varchar ( 40 );
4 realjob varchar ( 40 );
5 begin //存储过程调用开始
6 realsal: = 1100 ;
7 realname: = '' ;
8 realjob: = ' CLERK ' ;
9 runbyparmeters(realsal,realname,realjob); -- 必须按顺序
10 DBMS_OUTPUT.PUT_LINE(REALNAME || ' ' || REALJOB);
11 END ; //过程调用结束
12
2 realsal emp.sal % type;
3 realname varchar ( 40 );
4 realjob varchar ( 40 );
5 begin //存储过程调用开始
6 realsal: = 1100 ;
7 realname: = '' ;
8 realjob: = ' CLERK ' ;
9 runbyparmeters(realsal,realname,realjob); -- 必须按顺序
10 DBMS_OUTPUT.PUT_LINE(REALNAME || ' ' || REALJOB);
11 END ; //过程调用结束
12
过程调用方式二
1
declare
2 realsal emp.sal % type;
3 realname varchar ( 40 );
4 realjob varchar ( 40 );
5 begin //过程调用开始
6 realsal: = 1100 ;
7 realname: = '' ;
8 realjob: = ' CLERK ' ;
9 runbyparmeters(sname => realname,isal => realsal,sjob => realjob); -- 指定值对应变量顺序可变
10 DBMS_OUTPUT.PUT_LINE(REALNAME || ' ' || REALJOB);
11 END ; //过程调用结束
12
2 realsal emp.sal % type;
3 realname varchar ( 40 );
4 realjob varchar ( 40 );
5 begin //过程调用开始
6 realsal: = 1100 ;
7 realname: = '' ;
8 realjob: = ' CLERK ' ;
9 runbyparmeters(sname => realname,isal => realsal,sjob => realjob); -- 指定值对应变量顺序可变
10 DBMS_OUTPUT.PUT_LINE(REALNAME || ' ' || REALJOB);
11 END ; //过程调用结束
12