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参数,返回查询的结果集
--------------------------------------------------------------------------------------------------------------------
创建过程语法:
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) |