存储过程:
一、什么是存储过程
存储过程是一种命名PL/SQL程序块,它既可以没有参数,也可以有若干个输入、输出参数,甚至可以有多个既做输入又做输出的参数,但他通常没有返回值。存储过程被保存在数据库中他不可以被SQL语句直接执行或调用,只能通过EXECUT命令执行或在PL/SQL程序块内部被调用。由于存储过程是已将编译好的代码所以被调用或引用时,其执行效率很高。
二、创建存储过程
create [or replace] procedure pro_name [ (parameter1 [parameter2]...) is/as
begin
plsql_sentences;`在这里插入代码片`
[exception]
[dowith_sentences;]
end [pro_name];
参数说明:
<1>.[ ]内的是可选项。
<2>.pro_name 是存储过程的名称,当数据库里有这个名称时,可以加上or replace 覆盖掉原来的。
<3>.parameter1 是存储过程的参数。如果是输入参数则需要在其后边指定“in”关键字。若是输出参数则需要指定“out”关键字。在in或者out后的是参数类型但是不能指定该类型长度。
<4>.plsql_sentences 是存储过程功能实现的主体
<5>.dowith_sentences 异常处理语句。是一个可选项。
1、不含参数的存储过程
将empno=9010的人的名字修改为your name。
create or replace procedure proc_excution is
begin
update emp set ename='your name'
where empno=9010
end proc_excution;
/
上边的update仅仅是被编译了,并没有被执行。想要被执行还要在SQL*PLUS环境中用EXECUTE命令来执行该存储过程。或者在PL/SQL中调用该存储过程·。
- 在SQL*PLUS环境中用EXECUTE命令来执行该存储过程:
- 在PL/SQL中调用该存储过程·:
2、含参的存储过程及存储过程的参数
1>. in模式参数
这是一种输入型参数,参数值由调用方传入,并且只能被存储过程读取。关键词in位于参数名之后。
例题1.2
创建一个存储过程,并定义三个in模式变量,然后将这三个变量的值插入dept表中。
create or replace procedure insert_dept (
num_deptno in number, -- 定义in模式的变量他存储部门编号
var_ename in varchar2, -- 定义in模式变量他存储部门名称
var_loc in varchar2 ) is
begin
insert into dept
values (num_deptno,var_ename,var_loc);-- 向dept表中插入记录
commit;
end insert_dept;
/
在这里特别要注意的是参数的类型不能定义长度
2>.OUT模式参数
out 意为输出,这是一个输出型参数,表示这个参数在存储过程中已经被赋值,并且这个参数可以传递到当前存储过程以外的环境中关键词out位于参数名称之后。
例;
create or replace procedure select_dept(
num_deptno in number,
var_dname out dept.dname%type,
var_loc out dept.loc%type) is
begin
select dname ,loc
into var_dname,var_loc
from dept
where deptno=num_deptno;
exception
when no_data_found then
dbms_output.put_line (' 该部门号的不存在 ');
end select_dept;
/
在上面这个存储过程中定义了两个out类型的参数,既然是输出型的参数类型就需要在调用或执行有两个变量值来保护这两个out类型参数的返回值,
又分为两种情况:
-
在PL/SQL中调用含有out参数的存储过程
这种情况需要在PL/SQL语句块中的declare部分定义与存储过程中out参数兼容的若干变量。
-
在SQL*PLUS中使用exec执行含out参数的存储过程
3>.in out 模式参数
在执行存储过程时,in参数不能被修改,只能根据被传入的指定值为存储过程提供数据,而out参数只能被赋值而不能像in参数那样为存储过程本身提供数据,但in out参数可以兼顾。在调用存储过程师可以从外界向该类型参数传入值;在执行完存储过程后,可以将该参数返回值传给外界;
例题:求一个数值的平方或者平方根
create or replace procedure pro_square (
num in out number,
flag in boolean) is
i int:=2;
begin
if flag then
num:=power(num,i);
else
num:=sqrt(num);
end if;
end;
/
调用
emmmm,这个地方还有些问题,问题是他没有输出3的平方根呀(⊙o⊙)…
3、补充:含参数的存储过程,即存储过程传入参数的方式
说含有参数的存储过程之前先说一下下存储过程传入参数的方式:
第一种:指定名称传递
指定参数名称传递是指在向存储过程传递参数时需要指定参数名称,即参数名称在左边,中间是赋值符号“=>”,右侧是参数值,其格式如下:
pro_name (parameter1=>value [parameter1=>value2]…);
例题3:
以PL/SQL块中调用存储过程insert_dept,使用指定名称向其传入参数值,然后执行:
begin
insert_dept (var_ename=>'采购部',var_loc=>'成都',num_deptno=>15);
end;
/
== 第二种:按位置传递==
指定名称传递参数时如果参数过多会显得代码冗长,不易阅读,这时如果采用按位传递参数就会方便很多,按位传参时参数的顺序必须要与存储过程这中定义的参数顺序一致。
begin
insert_dept(28,'工程部','洛阳');
end;
/
第三种:混合方式传递
gu名思议,混合方式就是前两种方式的结合,这里就不再赘述了。