oracle 存储过程in out inout三种参数模式和PROMPT用法
    oracle 存储过程in out inout三种参数模式
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 out2009-08-11 16:30
创建过程语法:
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)  
-----------------------------------
PROMPT
oracle 用 prompt实现打印功能,多用于提示信息。输入命令prompt tablename1;
标准输出为tablename1 
PROMPT 告诉SQL*Plus 在屏幕上书写一行文字。你在这里使用了两个PROMPT命令;每个命令都在屏幕上打印一个空行,这对于垂直间距很有好处。ACCEPT命令是等待用户输入一个置换变量的值。ACCEPT命令中可选的PROMPT 子句在用户输入数值的同一行中显示了一条信息。你在PL/SQL 块的外面放置PROMPT 和 ACCEPT 是正确的:他们是SQL*Plus 命令,不是PL/SQL 。 
我的异常网推荐解决方案:oracle存储过程,http://www.aiyiweb.com/oracle-develop/177537.html