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