in 表示输入参数
out 表示输出参数
in out 表示此参数既输入又输出
out 表示输出参数
in out 表示此参数既输入又输出
解决方案 »
- 推荐一下初学者关于Oracle的书
- 全库搜索出现以下错误!
- 安装oracle时错误提示 写入文件F:\oracle\ora92\sysman\ole2\xpautune.reg时出现错误
- ORACLE数据库越来越大的问题
- 在线等,字符型转数值型(100分)
- 优化优化!!!!
- oracle 远程连接慢的问题!高分送!!!
- 这句SQL错在那??
- 如何在bat文件中调用sqlplus,并执行sql语句。
- oracle数据库在官网下载只下载了file1文件 导致数据库没有scott用户
- 关于Oracle调用外部的DLL问题!来者有分。100分送上
- jsp+oracle处理大字段内容时:某些内容可以录入,某些提示错误
2 v_p varchar2(100);
3 procedure pro(v out in varchar2)
4 as
5 begin
6 v:='1';
7 end;
8 begin
9 pro(v_p);
10 dbms_output.put_line(v_p);
11 end;
12 /declare
v_p varchar2(100);
procedure pro(v out in varchar2)
as
begin
v:='1';
end;
begin
pro(v_p);
dbms_output.put_line(v_p);
end;ORA-06550: 第 3 行, 第 23 列:
PLS-00103: 出现符号 "IN"在需要下列之一时:
<an identifier>
<a double-quoted delimited-identifier> LONG_ double ref
nocopy char time timestamp interval date binary national
character nchar
符号 "IN" 被忽略。
SQL> declare
2 v_p varchar2(100);
3 procedure pro(v in out varchar2)
4 as
5 begin
6 v:='1';
7 end;
8 begin
9 pro(v_p);
10 dbms_output.put_line(v_p);
11 end;
12 /PL/SQL procedure successfully completed
[ (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.
--节选自在线代码modetest.sql
REM 作者: Scott Urman.
REM 中文注释:赵元杰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.这是非法的,因为声明是IN */
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)