07第七章 包和子程序
第七章 包和子程序1.1 目標1. 過程和函數(shù)2. 過程和函數(shù)在plsql中調(diào)用3. 包1.2 知識點1. 過程和函數(shù)的作用,語法結(jié)構(gòu),參數(shù)的類型2. 在plsql語句塊中調(diào)用函數(shù)和過程3. 包和包體的作用,語法結(jié)構(gòu)1.3 難點1. 過程和函數(shù)的作用,語法結(jié)構(gòu),參數(shù)的類型2. 包和包體的作用,語法結(jié)構(gòu)1.4 講解內(nèi)容前面Plsql是匿名的存儲過程,可以批量執(zhí)行sql操作,并且可以加入條件控制,但是每次執(zhí)行的plsql腳本不能在服務(wù)器端保存,而過程和函數(shù)可以將plsql語句塊按功能劃分,并保存起來,實現(xiàn)代碼的復(fù)用,簡單的講,過程和函數(shù)是對plsql語句塊的封裝,是有名字的plsql語句塊。1.4.1 過程過程語法結(jié)構(gòu):Create or replace procedure 存儲過程名稱 as ß創(chuàng)建或重定義存儲過程名稱,Begin執(zhí)行過程的語句塊End;ß執(zhí)行語句塊用begin和end包圍,相當于程序中的,表示語句塊的開始和結(jié)束Create or replace procedure 存儲過程名稱(參數(shù)1,參數(shù)2) as ß創(chuàng)建或重定義存儲過程名稱,Begin執(zhí)行過程的語句塊End;要點:1. 參數(shù)默認是輸入?yún)?shù),注明out為輸出參數(shù) in out為輸入輸出參數(shù)2. 沒有參數(shù)的過程和函數(shù),在過程名稱后面不用帶()括號3. 有參數(shù)的過程和函數(shù),形式參數(shù)的數(shù)據(jù)類型不需要指定長度4. 局部變量放在 as 和begin之間,begin和end之間是plsql語句塊示例:create or replace procedure pro1 asbegindbms_output.put_line('dd');end;create or replace procedure pro2(v_val1 in out varchar2,v_val2 in out varchar2) asbegin dbms_output.put_line('v_val1:'|v_val1); dbms_output.put_line('v_val2:'|v_val2);end;1.4.2 函數(shù)函數(shù)的語法結(jié)構(gòu)和過程類似,區(qū)別在于多了一個返回值Create or replace function 函數(shù)名稱 return 類型 asß創(chuàng)建或重定義函數(shù),必須帶return和返回一個數(shù)據(jù)的類型Begin 函數(shù)執(zhí)行的語句塊 return 返回值 ß返回值,和創(chuàng)建函數(shù)聲明中返回類型要一致End;示例:create or replace function fun1 return varchar2 asbeginreturn 'ddd'end;create or replace function fun2(v_val1 in out varchar2,v_val2 in out varchar2) return varchar2 asbegindbms_output.put_line('v_val1:'|v_val1); dbms_output.put_line('v_val2:'|v_val2);return 'ddd'end;1.4.3 過程和函數(shù)在plsql中調(diào)用在plsql語句塊中調(diào)用函數(shù)和過程declarev_val1 varchar2(200):='aaaa'v_val2 varchar2(200):='dddd'v_result varchar2(400);begin -調(diào)用過程1 pro1; -調(diào)用過程2 pro2(v_val1,v_val2); -調(diào)用函數(shù)1 v_result:=fun1; -調(diào)用函數(shù)2 v_result:=fun2(v_val1,v_val2);end;要點:1. 過程可以再sqlplus命令行方式下調(diào)用,也可以再plsql語句塊中調(diào)用,而函數(shù)只能在plsql語句塊中調(diào)用。2. 過程在命令行下調(diào)用使用 call 過程名,在plsql中調(diào)用不需要call1.4.4 包包的概念是將某一系列的函數(shù)或過程進行封裝打包以便于管理和方便使用,創(chuàng)建包分為創(chuàng)建包體和創(chuàng)建包體2部分1.4.4.1 包頭create or replace package pak1 as-定義數(shù)據(jù)類型type curemptype is ref cursor;count int;-定義包的過程和函數(shù)procedure getrecord(curemp_ref out curemptype);end;要點:在包頭中定義引用游標類型和在plsql語句塊declare部分定義有一點區(qū)別,在類型名后多一個is1.4.4.2 包體create or replace package body pak1 asprocedure getrecord(curemp_ref out curemptype) asbegin open cur_emp for select * from emp;end;end;要點:返回引用游標的存儲過程只在過程中打開游標1.5 作業(yè)以scott示例用戶表為基礎(chǔ)編寫存儲過程1. 編寫一個過程,通過參數(shù)傳遞部門編號,查詢并打印相關(guān)部門的員工姓名、工作、入職日期、薪金等詳細信息。2. 編寫一個函數(shù),給工作是辦事員的員工加薪30%,給工作是銷售的加薪50%要求使用游標,函數(shù)返回修改的記錄個數(shù)。3. 編寫一個可供java程序調(diào)用的存儲過程,過程參數(shù)定義為輸入輸出的引用游標,返回emp表的記錄集4. 另外有一個網(wǎng)上商城的系統(tǒng),為了這個系統(tǒng)創(chuàng)建一個訂單處理的包,這個包中有一個存儲過程,用于刪除訂單,在刪除訂單的時候要求訂單式新建或中止狀態(tài)的才可以刪除,否則拋出異常信息。還有一個函數(shù),用于計算指定訂單編號的總金額,每個訂單有1個或多個子項,每個子項有單價和數(shù)量,函數(shù)有一個參數(shù)接收訂單編號返回訂單金額。以上存儲過程和函數(shù)都要采用包的方式創(chuàng)建。