- 除了日常的mysql,相信大家都知道Oracle由于其存在的時間之長,也是許多大廠的選擇。并且在日常的面試中,熟知Oracle與原本在面試中也是擁有極大的優(yōu)勢。而今天咱們就來說說Oracle中的存儲過程。
存儲過程是Oracle開發(fā)者在數(shù)據(jù)轉(zhuǎn)換或查詢報表時經(jīng)常使用的方式之一。
- 我們都知道,它就是想編程語言一樣一旦運行成功,在日常的使用中就可以被用戶隨時調(diào)用,這種方式極大的節(jié)省了用戶的時間,也提高了程序的執(zhí)行效率。存儲過程在數(shù)據(jù)庫開發(fā)中使用比較頻繁,它有著普通SQL語句不可替代的作用。
- 所謂存儲過程,就是一段存儲在數(shù)據(jù)庫中執(zhí)行某種功能的程序。其中包含一條或多條SQL語句,但是它的定義方式和PL/SQL中的塊、包等有所區(qū)別。存儲過程可以通俗地理解為是存儲在數(shù)據(jù)庫服務(wù)器中的封裝了一段或多段SQL語句的PL/SQL代碼塊。
- 在數(shù)據(jù)庫中有一些是系統(tǒng)默認(rèn)的存儲過程,那么可以直接通過存儲過程的名稱進(jìn)行調(diào)用。另外,存儲過程還可以在編程語言中調(diào)用,如Java、C#等。
存儲過程的優(yōu)點:
增加數(shù)據(jù)獨立性。與視圖的效果相似,利用存儲過程可以把數(shù)據(jù)庫基礎(chǔ)數(shù)據(jù)和程序(或用戶)隔離開來,當(dāng)基礎(chǔ)數(shù)據(jù)的結(jié)構(gòu)發(fā)生變化時,可以修改存儲過程,這樣對程序來說基礎(chǔ)數(shù)據(jù)的變化是不可見的,也就不需要修改程序代碼了。
簡化復(fù)雜的操作。存儲過程可以把需要執(zhí)行的多條SQL語句封裝到一個獨立單元中,用戶只需調(diào)用這個單元就能達(dá)到目的。這樣就實現(xiàn)了一人編寫多人調(diào)用。
提高性能。完成一項復(fù)雜的功能可能需要多條SQL語句,同時SQL每次執(zhí)行都需要編譯,而存儲過程可以包含多條SQL語句,而且創(chuàng)建后只需要編譯一次,以后就可以直接調(diào)用。
存儲過程的語法:
- 創(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ù)的數(shù)據(jù)類型只需要指明類型名即可,不需要指定寬度。 參數(shù)的寬度由外部調(diào)用者決定。 存儲過程可以有參數(shù),也可以沒有參數(shù)。
- 變量聲明塊:緊跟著的as (is )關(guān)鍵字,可以理解為pl/sql的declare關(guān)鍵字,用于聲明變量。 變量聲明塊用于聲明該存儲過程需要用到的變量,它的作用域為該存儲過程。另外這里聲明的變量必須指定寬度。
- 過程語句塊:從begin 關(guān)鍵字開始為過程的語句塊。存儲過程的具體邏輯在這里來實現(xiàn)。
- 異常處理塊:關(guān)鍵字為exception ,為處理語句產(chǎn)生的異常。該部分為可選 。
- 結(jié)束塊:由end關(guān)鍵字結(jié)束。
- 存儲過程的參數(shù)傳遞方式 :
- 存儲過程的參數(shù)傳遞有三種方式:IN,OUT,IN OUT .
- IN 按值傳遞,并且它不允許在存儲過程中被重新賦值。如果存儲過程的參數(shù)沒有指定存參數(shù)傳遞類型,默認(rèn)為IN
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(20);
begin
p_para1 :='aaa';
p_para2 :='bbb';
v_name := '張三豐';
p_para3 := v_name;
dbms_output.put_line('p_para3:'||p_para3);
null;
end;
OUT 參數(shù):作為輸出參數(shù),需要注意,當(dāng)一個參數(shù)被指定為OUT類型時,就算在調(diào)用存儲過程之前對該參數(shù)進(jìn)行了賦值,在存儲過程中該參數(shù)的值仍然是NULL.
IN OUT 是真正的按引用傳遞參數(shù)。即可作為傳入?yún)?shù)也可以作為傳出參數(shù)。