Oracle 數(shù)據(jù)庫應(yīng)用教程課件 第章_第1頁
Oracle 數(shù)據(jù)庫應(yīng)用教程課件 第章_第2頁
Oracle 數(shù)據(jù)庫應(yīng)用教程課件 第章_第3頁
Oracle 數(shù)據(jù)庫應(yīng)用教程課件 第章_第4頁
Oracle 數(shù)據(jù)庫應(yīng)用教程課件 第章_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7章

過程、函數(shù)和程序包

7.1子程序

7.2程序包

7.3小結(jié)

習(xí)題七

上機(jī)實驗七

7.1子程序

以前我們寫的PL/SQL語句程序都是瞬時的,都沒有命名。其缺點是:在每次執(zhí)行的時候都要被編譯,并且不能被存儲在數(shù)據(jù)庫中,其他PL/SQL塊也無法調(diào)用它們?,F(xiàn)在我們把命名的PL/SQL塊叫做子程序,它們存儲在數(shù)據(jù)庫中,可以為它們指定參數(shù),可以在數(shù)據(jù)庫客戶端和應(yīng)用程序中調(diào)用。命名的PL/SQL程序包括存儲過程和函數(shù)。程序包是存儲過程和函數(shù)的集合。

子程序結(jié)構(gòu)與PL/SQL匿名塊的相同點在于都由聲明、執(zhí)行、異常三大部分構(gòu)成,不同之處在于,PL/SQL匿名塊的聲明可選,而子程序的聲明則是必需的。子程序的優(yōu)點如下:

(1)模塊化:通過子程序可以將程序分解為可管理的、明確的邏輯模塊。

(2)可重用性:子程序在創(chuàng)建并執(zhí)行后,就可以在任何應(yīng)用程序中使用。

(3)可維護(hù)性:子程序可以簡化維護(hù)操作。

(4)安全性:用戶可以設(shè)置權(quán)限,保護(hù)子程序中的數(shù)據(jù),只能讓用戶提供的過程和函數(shù)訪問數(shù)據(jù)。這不僅可以讓數(shù)據(jù)更加安全,同時可保證正確性。

子程序有兩種類型:過程和函數(shù)。其中,過程用于執(zhí)行某項操作;函數(shù)用于執(zhí)行某項操作并返回值。

7.1.1過程

1.過程的創(chuàng)建和執(zhí)行

過程可使用createprocedure語句創(chuàng)建,語法如下:

createorreplaceprocedure[<方案名>.]<存儲過程名>

[parameterlist]

{Is|as}

[local_declarations];

Begin

executablestatements

[exception]

[Exception_handlers]

End[procedure_name];

保留字Is前面的過程定義稱為過程頭。

過程頭包括過程名和具有數(shù)據(jù)類型的參數(shù)列表。過程體包括聲明部分、執(zhí)行部分和異常處理部分。過程體從保留字Is之后開始。其中,聲明部分和異常處理部分是可選的;

執(zhí)行部分至少包含一條語句。這里的Is|as就相當(dāng)于declare聲明部分,除了擁有前面的一個過程聲明語句外,其他和以前的匿名PL/SQL塊一樣。其中,replace表示在創(chuàng)建存儲過程中,如果已經(jīng)存在同名的存儲過程,則重新創(chuàng)建;如果沒有此關(guān)鍵詞,則當(dāng)數(shù)據(jù)庫中有同名的過程時會報錯“ORA-00955號錯誤:名稱已被現(xiàn)有對象占用”。必須將同名的過程刪除后才能創(chuàng)建。

1)創(chuàng)建不帶參數(shù)的過程。

【例7.1】

創(chuàng)建一個過程multiplication,用來實現(xiàn)九九乘法表。

SQL>createorreplaceproceduremultiplication

2as

3iinteger;

4jinteger;

5begin

6dbms_output.put_line('printmultiplication');

7foriin1..9loop

8forjin1..9loop

9ifi>=jthen

10dbms_output.put(to_char(j)||'*'||

11to_char(i)||'='||to_char(i*j)||'');

12endif;

13endloop;

14dbms_output.put_line('');

15endloop;

16end;

17/

過程已創(chuàng)建。

出現(xiàn)編譯錯誤的時候可以用showerror或者descuser_errors來調(diào)試。

2)執(zhí)行過程

創(chuàng)建過程的時候并不會執(zhí)行過程,必須在這之后調(diào)用過程來執(zhí)行。執(zhí)行過程的方法有兩種:一種是在SQL提示符下,使用execute語句來執(zhí)行過程;另一種是在匿名塊中調(diào)用。

execute執(zhí)行過程的語法如下:

executeprocedure_name(parameters_list);【例7.2】

執(zhí)行multiplication過程。

SQL>setserverouton--將SQL*Plus的輸出打開

SQL>executemultiplication--執(zhí)行過程multiplication用execute命令。

printmultiplication

1*1=1

1*2=22*2=4

1*3=32*3=63*3=9

1*4=42*4=83*4=124*4=16

1*5=52*5=103*5=154*5=205*5=25

1*6=62*6=123*6=184*6=245*6=306*6=36

1*7=72*7=143*7=214*7=285*7=356*7=427*7=49

1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64

1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

PL/SQL過程已成功完成。

【例7.3】

在匿名塊中調(diào)用過程multiplication。

SQL>begin

2multiplication;

3end;

4/

程序運行結(jié)果同上。

2.創(chuàng)建建帶參參數(shù)的的過程程調(diào)用程程序通通過參參數(shù)可可向被被調(diào)用用子程程序傳傳遞值值。在在上述述語法法[parameterlist]中,參參數(shù)的的具體體形式式如下下:<參數(shù)數(shù)1,[方式1]<數(shù)據(jù)據(jù)類型型1>,<參數(shù)數(shù)2,[方式2]<數(shù)據(jù)據(jù)類型型2>,…參數(shù)方方式有有以下下三種種:(1)IN表示接接受值值為默默認(rèn)值值。(2)OUT表示將值返返回給子程程序的調(diào)用用程序。(3)INOUT表示接受值值并返回已已更新的值值。參數(shù)的書寫寫格式為::[(參數(shù)1IN|?OUT?|INOUT參數(shù)類型,參數(shù)2

IN|?OUT?|INOUT參數(shù)類型,,…)]。參數(shù)IN模式是默認(rèn)認(rèn)模式。如如果未指定定參數(shù)的模模式,則認(rèn)認(rèn)為該參數(shù)數(shù)是IN參數(shù)。對于于OUT和INOUT參數(shù),必須須明確指定定,并且這這兩種類型型的參數(shù)在在返回到調(diào)調(diào)用環(huán)境之之前必須先先賦值。IN參數(shù)可以在在調(diào)用時賦賦默認(rèn)值,,而OUT參數(shù)和INOUT參數(shù)不可以以。1)創(chuàng)建帶帶IN模式參參數(shù)的過程【例7.4】創(chuàng)建一個過程程,以雇員號號為參數(shù)查詢詢雇員的姓名名和職位。SQL>createorreplaceprocedurequeryEmpName(sFindNoemp.EmpNo%type)2as3sNameemp.ename%type;4sJobemp.job%type;5begin6selectename,jobintosName,sJobfromemp7whereempno=sFindNo;8dbms_output.put_line('IDis'||sFindNo||'dezhigongnameis'||9sName||'gongzuois'||sJob);10exception11whenno_data_foundthen12dbms_output.put_line('nodata');13whentoo_many_rowsthen14dbms_output.put_line('toomanydata');15whenothersthen16dbms_output.put_line('error');17end;18/過程已創(chuàng)建。。【例7.5】執(zhí)行queryEmpName過程。SQL>execqueryEmpName('7900');IDis7900dezhigongnameisJAMESgongzuoisCLERK同樣,也可通通過匿名塊調(diào)調(diào)用過程queryEmpName。SQL>Begin2queryEmpName('7900');3end;4/2)創(chuàng)創(chuàng)建帶OUT模模式參數(shù)數(shù)的過程程【例7.6】創(chuàng)建一個個過程,,以雇員員號查詢詢雇員的的薪水。。SQL>createorreplaceprocedurequeryEmpSal(sFindNoemp.EmpNo%type,v_saloutemp.sal%type)2as3begin4selectsalintov_salfromemp5whereempno=sFindNo;6dbms_output.put_line('Thesalaryof'||sFindNo||'is:'||v_sal);7exception8whenno_data_foundthen9dbms_output.put_line('nodata');10whentoo_many_rowsthen11dbms_output.put_line('toomanydata');12whenothersthen13dbms_output.put_line('error');14end;/過程已創(chuàng)建建。此過程帶有有一個輸入入?yún)?shù)sFindNo和輸出參數(shù)數(shù)v_sal,程序根據(jù)據(jù)輸入?yún)?shù)數(shù)到表中查查詢記錄,,以返回該該員工的薪薪水值?!纠?.7】執(zhí)行queryEmpSal過程。可以聲明一一個變量,,用如下的的方式調(diào)用用該過程。。SQL>varsalarynumber;SQL>execqueryEmpSal('7900',:salary);Thesalaryof7900is:950PL/SQL過程已成功功完成。另外,也可可以從一個個匿名的PL/SQL程序中執(zhí)行行上述過程程,以顯示示sal_out變量的輸出出結(jié)果。以以下代碼可可以顯示queryEmpSal過程的返回回值。Declarevaluenumber;BeginqueryEmpSal(7934,value);DBMS_OUTPUT.PUT_LINE('VALUE的值為'||to_char(value));End;/3)創(chuàng)建建帶INOUT模模式參數(shù)的的過程【例7.8】創(chuàng)建兩個數(shù)數(shù)進(jìn)行交換換的過程。。SQL>createorreplaceprocedureswap(p1INOUTnumber,p2INOUTnumber)2as3tempnumber;4begin5temp:=p1;6p1:=p2;7p2:=temp;8end;9/SQL>/過程已創(chuàng)建。。【例7.9】執(zhí)行swap過程。SQL>Declare2N1number:=10;3N2number:=20;4Begin5swap(N1,N2);6DBMS_OUTPUT.PUT_LINE('N1的值是'||N1);7DBMS_OUTPUT.PUT_LINE('N2的值是'||N2);8End;9/N1的值是20N2的值是10PL/SQL過程已成功完完成。3.過程的授權(quán)權(quán)只有創(chuàng)建過程程的用戶和管管理員才有使使用過程的權(quán)權(quán)限,如以上上示例,創(chuàng)建建的過程就像像創(chuàng)建的表一一樣,屬于當(dāng)當(dāng)前操作的用用戶,其他用用戶如果要調(diào)調(diào)用過程,則則需要得到該該過程的EXECUTE權(quán)限,,然后后通過過點標(biāo)標(biāo)記(dotnotation)(即“用用戶名名.過程名名”)來調(diào)用用過程程(數(shù)據(jù)字字典是是user_source)。以下下演示示如何何授權(quán)權(quán):SQL>GRANTEXECUTEONswapTOJohn;SQL>GRANTEXECUTEONqueryEmpNameTOPUBLIC;前者者將將swap過程程的的執(zhí)執(zhí)行行權(quán)權(quán)限限授授予予John用戶戶,,后后者者將將queryEmpName的執(zhí)執(zhí)行行權(quán)權(quán)限限授授予予所所有有數(shù)數(shù)據(jù)據(jù)庫庫用用戶戶。。4.刪刪除除過過程程刪除除存存儲儲過過程程的的命命令令的的一一般般格格式式如如下下::DROPPROCEDURE[<方案案名名>.]<存儲過程程名>;【例7.10】刪除過程程multiplication。SQL>DROPPROCEDUREmultiplication過程已丟丟棄。7.1.2函數(shù)函數(shù)與過過程相似似,也是是數(shù)據(jù)庫庫中存儲儲的已命命名PL/SQL程序塊。。與過程程不同的的是,函函數(shù)除了了完成一一定的功功能外,,還必須須返回一一個值。。1.創(chuàng)建函函數(shù)創(chuàng)建函數(shù)數(shù)是指通通過RETURN子句指定定函數(shù)返返回值的的數(shù)據(jù)類類型。在在函數(shù)體體的任何何地方,,用戶都都可以通通過RETURNexpression語句從函函數(shù)返回回。定義函數(shù)數(shù)的語法法如下::CREATE[ORREPLACE]FUNCTION[<方案名>.]<函數(shù)名>[parameterslist]RETURN<返回值類類型>IS|AS[local_declarations];Beginexecutablestatements[exception][Exception_handlers]End;其中,F(xiàn)UNCTION為PL/SQL函數(shù)的關(guān)關(guān)鍵字。?!纠?.11】創(chuàng)建一個個函數(shù),,以雇員員號查詢詢雇員的的姓名。。SQL>createorreplacefunctiongetName(snovarchar2)2returnvarchar3is4namevarchar(12);5begin6selectenameintonamefromemp7whereempno=sno;8returnname;9exception10whentoo_many_rowsthen11dbms_output.put_line('toomanydata');12whenothersthen13dbms_output.put_line('error');14end;15/函數(shù)已已創(chuàng)建建。2.執(zhí)行行函數(shù)數(shù)及授授權(quán)1)在在匿匿名塊塊中調(diào)調(diào)用函數(shù)調(diào)調(diào)用與與過程程調(diào)用用很相相似,,在匿匿名過過程中中通過過函數(shù)數(shù)名(或參數(shù)數(shù))可以調(diào)調(diào)用一一個函函數(shù)。。因為為過程程沒有有顯式式的RETURN語句,,所以以過程程調(diào)用用可以以是一一條單單獨的的語句句,寫寫在單單獨的的行中中。而而函數(shù)數(shù)則必必須有有一個個返回回值,,所以以函數(shù)數(shù)調(diào)用用要借借助于于可執(zhí)執(zhí)行語語句來來完成成,例例如賦賦值語語句、、選擇擇語句句和輸輸出語語句。。下面面的例例子通通過匿匿名過過程調(diào)調(diào)用getname函數(shù),將雇雇員號作為為參數(shù),此此函數(shù)將雇雇員姓名傳傳給調(diào)用塊塊,然后顯顯示雇員姓姓名。【例7.12】通過匿名過過程調(diào)用getname函數(shù)。SQL>declare2namevarchar(12);3begin4name:=getname('7902');5dbms_output.put_line(name);6end;7/FORDPL/SQL過程已成功功完成。2)在SQL語句句中調(diào)用除了在匿名名塊中調(diào)用用外,也可可以在SQL語句中調(diào)用用函數(shù)?!纠?.13】在SQL語句中調(diào)用用getname,顯示雇員員號為“7369”的雇員姓姓名。SQL>selectgetname('7369')fromdual;GETNAME('7369')------------------------SMITH【例7.14】從雇員表表中查找找雇員號號為“7369”的雇員員信息。。SQL>Select*fromempwhereename=getname(‘7369’’);EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO--------------------------------------------------7369SMITHCLERK790217-12月-80800203.函數(shù)的的授權(quán)與過程一一樣,只只有創(chuàng)建建函數(shù)的的用戶和和管理員員才有權(quán)權(quán)使用函函數(shù),其其他用戶戶如果要要調(diào)用函函數(shù),則則需要得得到該函函數(shù)的EXECUTE權(quán)限。【例7.15】將getname函數(shù)的執(zhí)執(zhí)行權(quán)限限授予John用戶。SQL>GRANTEXECUTEONgetnameTOJohn;4.刪除函函數(shù)刪除函數(shù)數(shù)的命令令的一般般格式如如下:DROPFUNCTION[<方案名>.]<函數(shù)名>;【例7.16】刪除函數(shù)數(shù)getname。SQL>DROPFUNCTIONgetname;7.1.3過程和函函數(shù)的比比較表7-1過程和函函數(shù)的比比較7.2程序包7.2.1程序包概概述程序包是是數(shù)據(jù)庫庫中的一一個實體體,包含含一系列列公共常常量、變變量、數(shù)數(shù)據(jù)類型型、游標(biāo)標(biāo)、過程程及函數(shù)數(shù)的定義義。使用用包更加加體現(xiàn)了了模塊化化編程的的優(yōu)點,,使得開開發(fā)工作作能靈活活自如地地進(jìn)行。。程序包包包括兩兩個部分分:程序序包規(guī)范范說明部部分和程程序包主主體部分分。1.程序包包規(guī)范說說明部分分該部分相相當(dāng)于一一個包的的頭,類類似于接接口,可可以對包包的部件件作簡單單說明。。其中的的過程、、函數(shù)、、變量、、常量和和游標(biāo)都都是公共共的,可可在應(yīng)用用程序中中訪問。。(1)使用createpackage進(jìn)行創(chuàng)建建。(2)包含公用用對象和和類型。。(3)聲明類型型、變量量、常量量、異常常、游標(biāo)標(biāo)和子程程序。(4)可以在沒沒有程序序包主體體部分的的情況下下存在。。2.程序包包主體部部分(1)使用createpackagebody進(jìn)行創(chuàng)建建。(2)包含子程程序和游游標(biāo)的定定義。(3)包含私有有聲明。。(4)不能在沒沒有程序序包規(guī)格格說明的的情況下下存在。。7.2.2創(chuàng)建程序序包程序包包包括兩部部分:規(guī)規(guī)范和主主體。規(guī)規(guī)范是程程序包的的公共接接口;主主體是規(guī)規(guī)范的實實現(xiàn),以以及私有有例程、、數(shù)據(jù)和和變量。。1.創(chuàng)建程程序包規(guī)規(guī)范CREATEORREPLACEPACKAGEpackage_nameIS|AS公用類型型或變量量常量的的聲明;;公用過程程或函數(shù)數(shù)的聲明明;ENDpackage_name;/2.創(chuàng)建程程序包主主體CREATEORREPLACEPACKAGEBODYpackage_nameIS|AS私有類型型或變量量常量的的聲明;;公用過程程或函數(shù)數(shù)的實現(xiàn)現(xiàn);ENDpackage_name規(guī)范是程程序包的的接口,,規(guī)范中中定義的的所有內(nèi)內(nèi)容都可可以由調(diào)調(diào)用者使使用(當(dāng)然需要要具有EXECUTE特權(quán)),比如規(guī)規(guī)范中定定義的過過程函數(shù)數(shù)可以被被執(zhí)行,,類型可可以被訪訪問,變變量可以以被引用用?!纠?.17】使用兩個個過程print_ename()和print_sal(),定義名名為employee_pkg的程序包包。SQL>CREATEORREPLACE2PACKAGEemployee_pkgas3Procedureprint_ename(p_empnonumber);4Procedureprint_sal(p_empnonumber);5End;6/程序包包已創(chuàng)創(chuàng)建。。此時并并沒有有為過過程提提供代代碼,,只是是定義義了名名稱和和參數(shù)數(shù)。這個時時候如如果試試圖使使用這這個包包,則則會報報錯。。SQL>execemployee_pkg.print_ename(1234);ERROR位于第第1行:ORA-04068:已丟棄棄程序序包的的當(dāng)前前狀態(tài)態(tài)ORA-04067:未執(zhí)行行,packagebody"SCOTT.EMPLOYEE_PKG"不存在在ORA-06508:PL/SQL:無法在在調(diào)用用之前前找到到程序序單元元ORA-06512:在line1程序包包是過過程函函數(shù)的的具體體實現(xiàn)現(xiàn)部分分,實實現(xiàn)規(guī)規(guī)范中中定義義的接接口。。SQL>CREATEORREPLACE2PACKAGEBODYemployee_pkgas3Procedureprint_ename(p_empnonumber)is4L_enameemp.ename%type;5Begin6Selectenameintol_enamefromempwhereempno=p_empno;7Dbms_output.put_line(l_ename);8Exception9Whenno_data_foundthen10Dbms_output.put_line('Invalidemployeenumber');11Endprint_ename;12Procedureprint_sal(p_empnonumber)is13L_salemp.sal%type;14Begin15Selectsalintol_salfromempwhereempno=p_empno;16Dbms_output.put_line(l_sal);17Exception18WhenNO_DATA_FOUNDthen19Dbms_output.put_line('Invalidemployeenumber');20Endprint_sal;21Endemployee_pkg;22/程序包主體體已創(chuàng)建。。7.2.3執(zhí)行行程程序序包包執(zhí)行行程程序序包包中中的的過過程程可可以以使使用用如如下下語語句句::EXECUTE包名名.過程程名名【例7.18】執(zhí)行行employee_pkg包里里的的print_ename過程程。。SQL>setserveroutputonSQL>execemployee_pkg.print_ename(7782);運行行結(jié)結(jié)果果如如下下::CLARKPL/SQL過程已成功完完成。SQL>execemployee_pkg.print_sal(7782);運行結(jié)果如下下:2450PL/SQL過程已成功完完成。執(zhí)行程序包中中的函數(shù)可以以通過一段代代碼塊來實現(xiàn)現(xiàn)。7.2.4程序包中的游游標(biāo)程序包中可以以定義和使用用游標(biāo)。游標(biāo)標(biāo)的定義分為為游標(biāo)規(guī)范和和游標(biāo)主體兩兩部分。在游游標(biāo)規(guī)范說明明部分必須通通過RETURN語句指定游標(biāo)標(biāo)的返回類型型。RETURN語句指定游標(biāo)標(biāo)獲取和返回回的數(shù)據(jù)元素素由select語句確定。select語句只出現(xiàn)在在主體定義中中,而不出現(xiàn)現(xiàn)在規(guī)范說明明中。【例7.19】下面使用程序序包中的游標(biāo)標(biāo)。student_package程序包中包含含4個過程和1個函數(shù)。其中中,select_student過程中中使用用了游游標(biāo)。。詳細(xì)細(xì)過程程如下下:(1)首先創(chuàng)創(chuàng)建student表結(jié)構(gòu)構(gòu)。SQL>createtablestudent(stuidvarchar2(4),stunamevarchar2(10),sechar(1));表已創(chuàng)創(chuàng)建。。(2)定義聲聲明。。SQL>createorreplacepackagestudent_packageis2typestudent_curisrefcursorreturnstudent%rowtype;3procedureinsert_student(stuinstudent%rowtype);4procedureupdate_student(stustudent%rowtype);5proceduredelete_student(snostudent.stuid%type);6procedureselect_student(stucurinoutstudent_cur);7functiongetStudentCountreturnnumber;8endstudent_package;9/程序包已創(chuàng)創(chuàng)建。(3)定義主體。。SQL>createorreplacepackagebodystudent_packageis2procedureinsert_student(stustudent%rowtype)is3icountint;4begin5selectcount(*)intoicountfromstudentwherestuid=stu.stuid;6ificount>0then7dbms_output.put_line('insertdataisalreadyexsist');8else9insertintostudentvalues(stu.stuid,stu.stuname,stu.se);10commit;11endif;12exception13whentoo_many_rowsthen14dbms_output.put_line('insertdataisalreadyexsist');15endinsert_student;16procedureupdate_student(stustudent%rowtype)is17icountint;18begin19selectcount(*)intoicountfromstudentwherestuid=stu.stuid;20ificount>0then21updatestudentsetstuname=stu.stuname,se=stu.sewherestuid=stu.stuid;22commit;23else24dbms_output.put_line('updatedatanotexist!');25endif;26endupdate_student;27proceduredelete_student(snostudent.stuid%type)is28icountint;29begin30ificount>0then31deletefromstudentwherestuid=sno;32commit;33else34dbms_output.put_line('deletedatanotexist');35endif;36enddelete_student;37procedureselect_student(stucurinoutstudent_cur)is38begin39openstucurforselect*fromstudent;40endselect_student;41functiongetStudentCountreturnnumberis42icountint;43begin44selectcount(*)intoicountfromstudent;45returnicount;46endgetStudentCount;47endstudent_package;48/程序包主體體已創(chuàng)建。。(4)調(diào)用程序包包插入一行行數(shù)據(jù)。SQL>declare2stustudent%rowtype;3begin4stu.stuid:=1009;5stu.stuname:='tonglei';6stu.se:='f';7student_package.insert_student(stu);8end;9/PL/SQL過程已成功功完成。(5)調(diào)用程序包包中的過程程select_student顯示數(shù)據(jù)。。SQL>varssrefcursor--定義游標(biāo)變變量SQL>execstudent_package.select_student(:ss);PL/SQL過程已成功功完成。顯示游標(biāo)變變量內(nèi)容如如下:SQL>printssSTUISTUNAMES-----------------1009tongleif7.2.5程序包的優(yōu)優(yōu)點程序包的優(yōu)優(yōu)點如下::(1)模塊化。包包可以使邏邏輯上相關(guān)關(guān)聯(lián)的類型型、項目和和子程序等等封裝進(jìn)一一個命名PL/SQL塊中。每個個包劃分功功能清晰,,包的接口口簡單、明明了。(2)可重用性。。一旦命名名并保存在在數(shù)據(jù)庫中中,任何應(yīng)應(yīng)用都可以以使用。(3)簡單的應(yīng)用用程序設(shè)計計。當(dāng)設(shè)計計應(yīng)用程序序時,只需需知道包的的接口部分分的信息,,可以只創(chuàng)創(chuàng)建并編譯譯包的規(guī)范范而不創(chuàng)建建包體。同同樣可以在在程序中引引用包,等等整個應(yīng)用用程序完成成后再來定定義具體的的包體。(4)抽象和數(shù)據(jù)據(jù)隱藏??煽梢灾付ü行畔⒑秃退接行畔⑾?。只有公公有信息才才可以被外外部應(yīng)用程程序訪問。。(5)更好的執(zhí)行效效能。包里的的子程序第一一次被調(diào)用時時,整個包被被調(diào)到內(nèi)存中中,以后的調(diào)調(diào)用就可以直直接從內(nèi)存中中讀取。這樣樣可以減少不不必要的重新新編譯。7.2.6有關(guān)子程序和和程序包的信信息子程序和程序序包是數(shù)據(jù)庫庫中存儲的對對象,Oracle會在數(shù)據(jù)字典典中存儲所有有對象的信息息。通過查詢詢數(shù)據(jù)字典可可以獲得它們們的信息。通通過查詢USER_OBJECTS數(shù)據(jù)字典視圖圖可以獲取有有關(guān)在會話中中創(chuàng)建的字程程序和程序包包的信息?!纠?.20】獲取程序包中中子程序和程程序包的信息息。SQL>COLUMNOBJECT_NAMEFORMATA18SQL>SELECTOBJECT_NAME,OBJECT_TYPEFROMUSER_OBJECTSWHEREOBJECT_TYPEIN('PROCEDURE','FUNCTION','PACKAGE','PACKAGEBODY');OBJECT_NAMEOBJECT_TYPE---------------------------EMPLOYEE_PKGPACKAGEEMPLOYEE_PKGPACKAGEBODYQUERYEMPNAMEPROCEDUREQUERYEMPSALPROCEDURESWAPPROCEDURE【例7.21】要獲取取存儲儲子程程序的的文本本,可可以查查詢USER_SOURCE。SQL>COLUMNLINEFORMAT9999SQL>COLUMNTEXTFORA50SQL>SELECTLINE,TEXTFROMUSER_SOURCEWHERENAME=’SWAP’’;LINETEXT-------------------------------------------1procedureswap(p1INOUTnumber,p2INOUTnumber)2as3tempnumber;4begin5temp:=p1;6p1:=p2;7p2:=temp;8end;【例7.22】獲得程序序包中子子程序規(guī)規(guī)范employee_pkg信息。SQL>DESCemployee_pkg;PROCEDUREPRINT_ENAME7.3小結(jié)過程、函函數(shù)和子子程序都都可以用用于執(zhí)行行對數(shù)據(jù)據(jù)庫的操操作,可可以帶上上用戶自自定義的的參數(shù)。。它們封封裝了數(shù)數(shù)據(jù)類型型定義、、變量說說明、游游標(biāo)、異異常等,,方便了了用戶管管理操縱縱數(shù)據(jù)庫庫數(shù)據(jù)。。習(xí)題七一、選擇擇題1.執(zhí)行特特定任務(wù)務(wù)的子程程序是()。A.函數(shù)B.過程C.程序包D.游標(biāo)2.子程序序的()模式參數(shù)數(shù)可以在在調(diào)用子子程序時時指定一一個常量量。A.INB.OUTC.INOUT3.如果存儲儲過程的的參數(shù)類類型為OUT,那么調(diào)調(diào)用時傳傳遞的參參數(shù)應(yīng)該該為()。A.常量B.表達(dá)式C.變量D.都可以4.下列有有關(guān)存儲儲過程的的特點,,說法錯錯誤的是是()。A.存儲過程程不能將將值傳回回調(diào)用的的主程序序B.存儲過程程是一個個命名的的模塊C.編譯的存存儲過程程存放在在數(shù)據(jù)庫庫中D.一個存儲儲過程可可以調(diào)用用另一個個存儲過過程5.包中不不能包含含的元素素為()。A.存儲過程程B.存儲函數(shù)數(shù)C.游標(biāo)D.表6.下列有有關(guān)包的的使用,,說法錯錯誤的是是()。A.在不同的的包內(nèi)模模塊可以以重名B.包的私有有過程不不能被外外部程序序調(diào)用C.包體中的的過程和和函數(shù)必必須在包包頭部分分說明D.必須先創(chuàng)創(chuàng)建包頭頭,然后后創(chuàng)建包包體二、編程程題1.編寫程程序包,,此程序序包有兩兩個過程程和一個個函數(shù),,第一個個過程根根據(jù)職員員編號打打印職員員姓名,,第二個個過程根根據(jù)職員員編號打打印職員員的部門門編號。。函數(shù)根根據(jù)職員員編號返返回職員員的薪水水。提示:使使用scott用戶的emp表作為數(shù)數(shù)據(jù)源。。2.編寫函函數(shù)接受受學(xué)生的的學(xué)號,,并計算算該學(xué)生生3門課程的的總分。。3.編寫一一個過程程,將10號部門員員工薪水水上漲10%,20號部門員員工薪水水上漲20%,其他部部門員工工薪水保保持不變變。上機(jī)實驗七七實驗1過程目的和要求求:1.掌握編寫寫過程的方方法。2.掌握調(diào)用用過程的方方法。實驗內(nèi)容::編寫一個過過程,要求求根據(jù)用戶戶輸入的員員工號(emp_no)查詢EMP表,返回員員工的姓名名和工作職職位(empName和empJob)。并編寫一一個匿名塊塊調(diào)用此過過程(使用SCOTT用戶的EMP表)。SQL>createorreplaceprocedurepro_emp(emp_nonumber)2as3empNamevarchar2(20);4empJobvarchar2(20);5begin6selectename,jobintoempName,empJobfromempwhereempno=emp_no;7DBMS_OUTPUT.PUT_LINE('雇員的姓名名是:'||empName);8DBMS_OUTPUT.PUT_LINE('雇員的職位位是:'||empJob);9EXCEPTION10whenNO_DATA_FOUNDthen11DBMS_OUTPUT.PUT_LINE('雇員編號未未找到!');12endpro_emp;13/過程已創(chuàng)建建。SQL>setserveroutputon;SQL>executepro_emp(7369);雇員的姓名名是:SMITH雇員的職位位是:CLERKPL/SQL過程已成功功完成。實驗2函數(shù)目的和要求求:1.掌握編編寫函數(shù)數(shù)的方法法。2.掌握調(diào)調(diào)用函數(shù)數(shù)的方法法。實驗內(nèi)容:1.編寫函數(shù)以以接受學(xué)生的的學(xué)號,并計計算此學(xué)生3門課程的平均均分。SQL>createorreplacefunctionfun_score(student_nonumber)2returnfloat3as4s1float(10);5s2float(10);6s3float(10);7score_avgfloat(10);8begin9selectoracle,java,csharpintos1,s2,s3fromscorewherestuID=student_no;10score_avg:=(s1+s2+s3)/3.0;11returnscore_avg;12EXCEPTI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論