1.概述
存储过程也是一种PL/SQL块,是存入数据库的PL/SQL块。
但存储过程不同于已经普通的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程是以命名的方式存储于数据库中的。
因此,我们可以这样理解,为PLSQL程序块起个名字,不用每次都编译,可以直接调用,就是存储过程。
2.存储过程优点
和PL/SQL程序相比,存储过程有很多优点,具体归纳:
1. 与数据库关联。存储过程的代码保存在数据库中而非本地,用户可在任何登陆的客户机上调用修改该存储过程。
2. 代码复用性。存储过程的信息写入数据字典,因此是一个公用模块,我们可以通过两外的存储过程和函数调用已经存在的存储过程。
但是,存储过程不能调用PLSQL程序块。
3. 存储过程支持传递参数,并支持返回值。
4. 存储过程需要进行编译。编译不通过仍然可以创建,但是通过PLSQL developer等工具会有警告。
5. 安全性。存储过程可由数据库提供安全保证,要想使用存储过程,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。
3.创建存储过程
存储过程create or replace procedure p is
相当于PLSQL中的declare,其余都和PLSQL基本一致。
CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]
{AS|IS}
[说明部分]
BEGIN
可执行部分
[EXCEPTION
错误处理部分]
END [过程名];
3.1存储过程三种参数类型
存储过程可以传入参数,支持三种参数类型:
- 传入参数:in或者不写;
- 传出参数:out,类似于返回值return。
- 传入传出参数: in out 既是传入又是传出。
这里需要理解,存储过程的参数都是存储过程和调用环境的交互。
3.1创建简单存储过程
create or replace procedure p(v_in in number, v_out out number, v_v number, v_io in out number)
is
begin
if(v_in>v_v) then
v_out := v_in;
else
v_out := v_v;
end if;
v_io := v_io + 1;
end;
/
这里需要注意的是,如果存储过程中出现语法错误,仍然会创建。
3.2执行存储过程
存储过程有两种执行方式:
方式一:通过exec关键字执行。
exec p;
方式二:通过PLSQL块执行。
begin
p;
end;
因此基于方法二,我们可以通过存储过程调用存储过程,也可以通过PLSQL块调用存储过程,还可以通过JOB周期性调用存储过程。
如下,我们通过PLSQL块调用上述创建的存储过程。
set serveroutput on;
declare
v_in number := 10;
v_v number := 20;
v_io number := 30;
v_out number;
begin
p(v_in, v_out, v_v, v_io);
dbms_output.put_line(v_out);
dbms_output.put_line(v_io);
end;
/
3.3删除存储过程
直接通过dorp关键字。
drop procedure p;