oracle 进阶(二)存储过程的使用
存储过程
存储过程相当于 Java 中的无返回值函数,可以被其它模块反复调用,但是存储过程可以通过输出参数返回多个处理结果,存储过程会在数据库中一直保留,直到被删除。
1、语法结构
CREATE [OR REPLACE] PROCEDURE
[schema.]procedure_name
[arg1 [IN|OUT|IN OUT]] arg_type1,
[arg2 [IN|OUT|IN OUT]] arg_type2,
……
IS|AS
--声明部分
BEGIN
--执行部分
EXCEPTION
--异常处理部分
END procedure_name;
说明:
其中: OR RELACE 是可选的。
如果省略,则创建时不允许数据库中有同名的过程;
如果使用,则会先删除同名的过程,然后创建新的过程。
arg1,arg2,…,argn 是过程的形参的名称,是可选的。
arg_type1, arg_type2,…,arg_typen 是对应的型参的数据类型,参数类型可以是基本的数据类型,也可以是 %type 或 %rowtype 匹配的类型,不能使用空值 null,但是存储过程可以返回空值。
注意:此处的数据类型后面不能带参数,
即精度、范围等,如 NUMBER(12,2)只能写成 NUMBER,varchar2(20),只能写成 varchar2。
IN|OUT|IN OUT 是形参的模式。如果省略则为 IN 模式。
IN
用于接受调用程序的值 默认的参数模式
OUT
用于向调用程序返回值
IN OUT
用于接受调用程序的值,并向调用程序返回更新的值
2、示例
无参存储过程:
--创建过程,无参过程名后不要加括号
create or replace procedure proc_first
is
v_ename varchar2(10):='北京';
begin
dbms_output.put_line(v_ename);
end proc_first;
有参数存储过程:
--创建有参数的过程
create or replace procedure proc_find(
v_eno number,
v_esal out number
)
is
v_ename emp.ename%type;
begin
select ename,sal into v_ename,v_esal from emp where empno=v_eno;
dbms_output.put_line(v_ename||'--'||v_esal);
end proc_find;
3、执行
使用 EXECUTE 语句
语法
EXECUTE procedure_name (list of parameters) ;
其中,
Procedure_name 是过程的名称,
list of parameters 是参数列表。
--执行无参存储过程
declare
begin
proc_first();
end;
--执行有参存储过程
declare
v_esal number;
begin
proc_find(7369,v_esal);
end;
4、删除
语法
DROP PROCEDURE procedure_name;
其中,procedure_name 是过程的名称。
--删除存储过程
drop procedure proc_first;