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