1 回答

TA貢獻2051條經驗 獲得超10個贊
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 。
- 1 回答
- 0 關注
- 546 瀏覽
添加回答
舉報