1 回答

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
oracle 存儲(chǔ)過(guò)程in out inout三種參數(shù)模式
oracle過(guò)程中定義了in|out|in out3中參數(shù)模式,每個(gè)參數(shù)可以選擇其一
in 是參數(shù)的默認(rèn)模式,這種模式就是在程序運(yùn)行的時(shí)候已經(jīng)具有值,在程序體中值不會(huì)改變。
舉個(gè)例子
create or replace procedure update_price(
p_product_id in NUMBER,
p_factor in NUMBER)
AS
.....
你在引用這個(gè)過(guò)程的時(shí)候給參數(shù)傳入值
exexute update_price(2,2.5);
這是定義的2個(gè)參數(shù)就得到了值,in模式下值不能變
out模式定義的參數(shù)只能在過(guò)程體內(nèi)部賦值,表示該參數(shù)可以將某個(gè)值傳遞回調(diào)用他的過(guò)程
in out 表示高參數(shù)可以向該過(guò)程中傳遞值,也可以將某個(gè)值傳出去
簡(jiǎn)單的說(shuō)in參數(shù)就是傳入但存儲(chǔ)過(guò)程里面處理的參數(shù)
out參數(shù)就是返回值的參數(shù)。
in參數(shù)就像c++語(yǔ)言里函數(shù)一般的參數(shù)那樣
而out函數(shù)就像c++里函數(shù)的引用類型參數(shù)一樣
不知道我比喻是否正確,請(qǐng)高手指點(diǎn)
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;
例如上面的存儲(chǔ)過(guò)程
stdname是in參數(shù),傳進(jìn)去供查詢語(yǔ)句使用
p_cursor是 out參數(shù),返回查詢的結(jié)果集
--------------------------------------------------------------------------------------------------------------------
oracle 存儲(chǔ)過(guò)程 in out2009-08-11 16:30
創(chuàng)建過(guò)程語(yǔ)法:
create [or replace] procedure procedure_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<類型.變量的說(shuō)明>
( 注: 不用 declare 語(yǔ)句 )
Begin
<執(zhí)行部分>
exception
<可選的異常處理說(shuō)明>
end;
l 這里的IN表示向存儲(chǔ)過(guò)程傳遞參數(shù),OUT表示從存儲(chǔ)過(guò)程返回參數(shù)。而IN OUT 表示傳遞參數(shù)和返回參數(shù);
l 在存儲(chǔ)過(guò)程內(nèi)的變量類型只能指定變量類型;不能指定長(zhǎng)度;
l 在AS或IS 后聲明要用到的變量名稱和變量類型及長(zhǎng)度;
l 在AS或IS 后聲明變量不要加declare 語(yǔ)句。
例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 使用過(guò)程
存儲(chǔ)過(guò)程建立完成后,只要通過(guò)授權(quán),用戶就可以在SQLPLUS 、Oracle開(kāi)發(fā)工具或第三方開(kāi)發(fā)工具來(lái)調(diào)用運(yùn)行。Oracle使用EXECUTE 語(yǔ)句來(lái)實(shí)現(xiàn)對(duì)存儲(chǔ)過(guò)程的調(diào)用。
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實(shí)現(xiàn)打印功能,多用于提示信息。輸入命令prompt tablename1;
標(biāo)準(zhǔn)輸出為tablename1
PROMPT 告訴SQL*Plus 在屏幕上書寫一行文字。你在這里使用了兩個(gè)PROMPT命令;每個(gè)命令都在屏幕上打印一個(gè)空行,這對(duì)于垂直間距很有好處。ACCEPT命令是等待用戶輸入一個(gè)置換變量的值。ACCEPT命令中可選的PROMPT 子句在用戶輸入數(shù)值的同一行中顯示了一條信息。你在PL/SQL 塊的外面放置PROMPT 和 ACCEPT 是正確的:他們是SQL*Plus 命令,不是PL/SQL 。
- 1 回答
- 0 關(guān)注
- 539 瀏覽
添加回答
舉報(bào)