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
v_LocalVariable := p_InParameter; -- Legal
p_InParameter := 7; -- Illegal
p_OutParameter := 7; -- Legal
v_LocalVariable := p_outParameter; -- Illegal
v_LocalVariable := p_InOutParameter; -- Legal
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 过 程中定 义 了 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
v_LocalVariable := p_InParameter; -- Legal
p_InParameter := 7; -- Illegal
p_OutParameter := 7; -- Legal
v_LocalVariable := p_outParameter; -- Illegal
v_LocalVariable := p_InOutParameter; -- Legal
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 。