先來看一個簡單的存儲過程
create or replace procedure proc1(
para1 varchar2,
para2 out varchar2,
para3 in out varchar2
) as
v_name varchar2(20);
begin
v_name :='zhanghaiwei';
para3 := v_name;
dbms_output.put_line('para3:'||para3);
end;
其構(gòu)成:
- 創(chuàng)建語句:create or replace procedure 存儲過程名
如果沒有or replace語句单鹿,則僅僅是新建一個存儲過程。如果系統(tǒng)存在該存儲過程劲妙,則會報錯。Create or replace procedure 如果系統(tǒng)中沒有此存儲過程就新建一個镣奋,如果系統(tǒng)中有此存儲過程則把原來刪除掉,重新創(chuàng)建一個存儲過程侨颈。
?????存儲過程名定義:包裹存儲過程名和參數(shù)列表(參數(shù)名和參數(shù)類型)哈垢,參數(shù)名不能重復(fù),參數(shù)傳遞方式:IN,OUT,IN OUT:
?????IN表示輸入?yún)?shù)耘分,按值傳遞方式。如果存儲過程的參數(shù)沒有指定存參數(shù)傳遞類型央渣,默認(rèn)為IN ;
?????OUT表示輸出參數(shù)渴频,可以理解為按引用傳遞方式,可以作為存儲過程的輸出結(jié)果卜朗,供外部調(diào)用者使用。需要注意聊替,當(dāng)一個參數(shù)被指定為OUT類型時培廓,就算在調(diào)用存儲過程之前對該參數(shù)進(jìn)行了賦值,在存儲過程中該參數(shù)的值仍然是null;
?????IN OUT既可以作為輸入?yún)?shù)泣港,也可作為輸出參數(shù);
?????參數(shù)的數(shù)據(jù)類型只需要指明類型名即可价匠,不需要指定寬度,參數(shù)的寬度由外部調(diào)用者決定坡氯。
- 變量聲明塊
緊跟著as(is)關(guān)鍵字,或者用declare關(guān)鍵字箫柳,用于聲明變量悯恍,變量聲明塊用于聲明該存儲過程需要用到的變量,他的作用域為該存儲過程涮毫,另外這里聲明的變量必須指定寬度,遵循PL/SQL的變量聲明規(guī)范。
- 過程語句塊
從begin 關(guān)鍵字開始為過程的語句塊顷帖。存儲過程的具體邏輯在這里來實現(xiàn)渤滞。
- 異常處理塊
關(guān)鍵字為exception ,為處理語句產(chǎn)生的異常妄呕。該部分為可選
- 結(jié)束塊
由end關(guān)鍵字結(jié)果
另附:
我們無法在存儲過程的定義中指定存儲參數(shù)的寬度绪励,也就導(dǎo)致了我們無法在存儲過程中控制傳入變量的寬度,這個寬度是完全由外部傳入是決定的。
create or replace procedure proc2(
para1 varchar2,
para2 out varchar2,
para3 in out varchar2
) as
v_name varchar2(2);
begin
para2 :='aaaaaaaaaaaaaaaaaaaa';
end;
--調(diào)用proc2
var p1 varchar2(1);
var p2 varchar2(1);
var p3 varchar2(1);
exec :p2 := 'a';
exec proc1(:p1,:p2,:p3);
在該過程中大莫,p_para2被賦予了20個字符a.
而在外部的調(diào)用過程中,p2這個參數(shù)僅僅被定義為varchar2(1).
而把p2作為參數(shù)調(diào)用這個過程烙丛,卻并沒有報錯羔味。而且它的真實值就是20個a
執(zhí)行這個過程,仍然正確執(zhí)行赋元。
可見,對于IN參數(shù)情屹,其寬度是由外部決定垃你。
對于OUT 和IN OUT 參數(shù)惜颇,其寬度是由存儲過程內(nèi)部決定凌摄。
因此漓帅,在寫存儲過程時忙干,對參數(shù)的寬度進(jìn)行說明是非常有必要的捐迫,最明智的方法就是參數(shù)的數(shù)據(jù)類型使用%type施戴。這樣雙方就達(dá)成了一致。
參數(shù)默認(rèn)值
create or replace procedure procdefault(
p1 varchar2,
p2 varchar2 default 'mark'
) as
begin
dbms_output.put_line(p2);
end;
可以通過default 關(guān)鍵字為存儲過程的參數(shù)指定默認(rèn)值雷则。在對存儲過程調(diào)用時月劈,就可以省略默認(rèn)值。
需要注意的是:默認(rèn)值僅僅支持IN傳輸類型的參數(shù)湾盒。OUT 和 IN OUT不能指定默認(rèn)值