您的位置:首页 > 数据库 > Oracle

oracle 存储过程in out inout三种参数模式

2013-01-05 17:10 204 查看
Oracle 过程中定义了in|out|in out3中参数模式,每个参数可以选择其一

in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。

举个例子

create or replace procedure update_price(

p_product_id in NUMBER,

p_factor in NUMBER)

AS

.....

你在引用这个过程的时候给参数传入值

exexute update_price(2,2.5);

这是定义的2个参数就得到了值,in模式下值不能变

out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程

in out 表示高参数可以向该过程中传递值,也可以将某个值传出去

简单的说in参数就是传入但存储过程里面处理的参数

out参数就是返回值的参数。

in参数就像c++语言里函数一般的参数那样

而out函数就像c++里函数的引用类型参数一样

不知道我比喻是否正确,请高手指点

create or replace procedure gettest2(stdname in varchar2,p_cursor in out types.mytype)

as

begin

open p_cursor for select * from test where name=stdname;

end;

例如上面的存储过程

stdname是in参数,传进去供查询语句使用

p_cursor是 out参数,返回查询的结果集

--------------------------------------------------------------------------------------------------------------------

oracle 存储过程 in out
创建过程语法:

create [or replace] procedure procedure_name

[ (argment [ { in| in out }] type,

argment [ { in | out | in out } ] type

{ is | as }

<类型.变量的说明>

( 注: 不用 declare 语句 )

Begin

<执行部分>

exception

<可选的异常处理说明>

end;

l 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;

l 在存储过程内的变量类型只能指定变量类型;不能指定长度;

l 在AS或IS 后声明要用到的变量名称和变量类型及长度;

l 在AS或IS 后声明变量不要加declare 语句。

例1.

CREATE OR REPLACE PROCEDURE ModeTest (

p_InParameter IN NUMBER,

p_OutParameter OUT NUMBER,

p_InOutParameter IN OUT NUMBER) IS

v_LocalVariable NUMBER;

BEGIN

/* 分配 p_InParameter 给 v_LocalVariable. */

v_LocalVariable := p_InParameter; -- Legal

/* 分配 7 给 p_InParameter. 这是非法的,因为声明是IN */

p_InParameter := 7; -- Illegal

/* 分配 7 给 p_InParameter. 这是合法的,因为声明是OUT */

p_OutParameter := 7; -- Legal

/* 分配 p_OutParameter 给 v_LocalVariable.这是非法的,因为声明是OUT */

v_LocalVariable := p_outParameter; -- Illegal

/* 分配 p_InOutParameter 给 v_LocalVariable. 这是合法的,因为声明是IN OUT */

v_LocalVariable := p_InOutParameter; -- Legal

/*分配 7 给 p_InOutParameter. 这是合法的,因为声明是IN OUT */

p_InOutParameter := 7; -- Legal

END ModeTest;

/

§16.2.2 使用过程

存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、Oracle开发工具或第三方开发工具来调用运行。Oracle 使用EXECUTE 语句来实现对存储过程的调用。

EXEC[UTE] procedure_name( parameter1, parameter2…);

例:

CREATE PACKAGE emp_data AS

TYPE EmpRecTyp IS RECORD (

emp_id NUMBER(4),

emp_name VARCHAR2(10),

job_title VARCHAR2(9),

dept_name VARCHAR2(14),

dept_loc VARCHAR2(13));

TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;

PROCEDURE get_staff (

dept_no IN NUMBER,

emp_cv IN OUT EmpCurTyp);

END;

/

CREATE PACKAGE BODY emp_data AS

PROCEDURE get_staff (

dept_no IN NUMBER,

emp_cv IN OUT EmpCurTyp) IS

BEGIN

OPEN emp_cv FOR

SELECT empno, ename, job, dname, loc FROM emp, dept

WHERE emp.deptno = dept_no AND emp.deptno = dept.deptno

ORDER BY empno;

END;

END;

/

COLUMN EMPNO HEADING Number

COLUMN ENAME HEADING Name

COLUMN JOB HEADING JobTitle

COLUMN DNAME HEADING Department

COLUMN LOC HEADING Location

SET AUTOPRINT ON

VARIABLE cv REFCURSOR

EXECUTE emp_data.get_staff(20, :cv)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: