




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章
過(guò)程、函數(shù)和程序包
7.1子程序
7.2程序包
7.3小結(jié)
習(xí)題七
上機(jī)實(shí)驗(yàn)七
第7章過(guò)程、函數(shù)和程序包7.1子程序 7.1子程序
以前我們寫(xiě)的PL/SQL語(yǔ)句程序都是瞬時(shí)的,都沒(méi)有命名。其缺點(diǎn)是:在每次執(zhí)行的時(shí)候都要被編譯,并且不能被存儲(chǔ)在數(shù)據(jù)庫(kù)中,其他PL/SQL塊也無(wú)法調(diào)用它們。現(xiàn)在我們把命名的PL/SQL塊叫做子程序,它們存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以為它們指定參數(shù),可以在數(shù)據(jù)庫(kù)客戶端和應(yīng)用程序中調(diào)用。命名的PL/SQL程序包括存儲(chǔ)過(guò)程和函數(shù)。程序包是存儲(chǔ)過(guò)程和函數(shù)的集合。
子程序結(jié)構(gòu)與PL/SQL匿名塊的相同點(diǎn)在于都由聲明、執(zhí)行、異常三大部分構(gòu)成,不同之處在于,PL/SQL匿名塊的聲明可選,而子程序的聲明則是必需的。 7.1子程序
以前我們寫(xiě)的PL/SQL子程序的優(yōu)點(diǎn)如下:
(1)模塊化:通過(guò)子程序可以將程序分解為可管理的、明確的邏輯模塊。
(2)可重用性:子程序在創(chuàng)建并執(zhí)行后,就可以在任何應(yīng)用程序中使用。
(3)可維護(hù)性:子程序可以簡(jiǎn)化維護(hù)操作。
(4)安全性:用戶可以設(shè)置權(quán)限,保護(hù)子程序中的數(shù)據(jù),只能讓用戶提供的過(guò)程和函數(shù)訪問(wèn)數(shù)據(jù)。這不僅可以讓數(shù)據(jù)更加安全,同時(shí)可保證正確性。
子程序有兩種類型:過(guò)程和函數(shù)。其中,過(guò)程用于執(zhí)行某項(xiàng)操作;函數(shù)用于執(zhí)行某項(xiàng)操作并返回值。
子程序的優(yōu)點(diǎn)如下:
(1)模塊化:通過(guò)子程序可以將7.1.1過(guò)程
1.過(guò)程的創(chuàng)建和執(zhí)行
過(guò)程可使用createprocedure語(yǔ)句創(chuàng)建,語(yǔ)法如下:
createorreplaceprocedure[<方案名>.]<存儲(chǔ)過(guò)程名>
[parameterlist]
{Is|as}
[local_declarations];
Begin
executablestatements
[exception]
[Exception_handlers]
End[procedure_name];
7.1.1過(guò)程
1.過(guò)程的創(chuàng)建和執(zhí)行
過(guò)程可使用保留字Is前面的過(guò)程定義稱為過(guò)程頭。
過(guò)程頭包括過(guò)程名和具有數(shù)據(jù)類型的參數(shù)列表。過(guò)程體包括聲明部分、執(zhí)行部分和異常處理部分。過(guò)程體從保留字Is之后開(kāi)始。其中,聲明部分和異常處理部分是可選的;
執(zhí)行部分至少包含一條語(yǔ)句。這里的Is|as就相當(dāng)于declare聲明部分,除了擁有前面的一個(gè)過(guò)程聲明語(yǔ)句外,其他和以前的匿名PL/SQL塊一樣。其中,replace表示在創(chuàng)建存儲(chǔ)過(guò)程中,如果已經(jīng)存在同名的存儲(chǔ)過(guò)程,則重新創(chuàng)建;如果沒(méi)有此關(guān)鍵詞,則當(dāng)數(shù)據(jù)庫(kù)中有同名的過(guò)程時(shí)會(huì)報(bào)錯(cuò)“ORA-00955號(hào)錯(cuò)誤:名稱已被現(xiàn)有對(duì)象占用”。必須將同名的過(guò)程刪除后才能創(chuàng)建。
保留字Is前面的過(guò)程定義稱為過(guò)程頭。?過(guò)程頭包括過(guò)程名和1)創(chuàng)建不帶參數(shù)的過(guò)程。
【例7.1】
創(chuàng)建一個(gè)過(guò)程multiplication,用來(lái)實(shí)現(xiàn)九九乘法表。
SQL>createorreplaceproceduremultiplication
2as
3iinteger;
4jinteger;
5begin
6dbms_output.put_line('printmultiplication');
7foriin1..9loop
8forjin1..9loop
9ifi>=jthen1)創(chuàng)建不帶參數(shù)的過(guò)程。
【例7.1】創(chuàng)建一個(gè)過(guò)
10dbms_output.put(to_char(j)||'*'||
11to_char(i)||'='||to_char(i*j)||'');
12endif;
13endloop;
14dbms_output.put_line('');
15endloop;
16end;
17/
過(guò)程已創(chuàng)建。
出現(xiàn)編譯錯(cuò)誤的時(shí)候可以用showerror或者descuser_errors來(lái)調(diào)試。
10dbms_output.put(2)執(zhí)行過(guò)程
創(chuàng)建過(guò)程的時(shí)候并不會(huì)執(zhí)行過(guò)程,必須在這之后調(diào)用過(guò)程來(lái)執(zhí)行。執(zhí)行過(guò)程的方法有兩種:一種是在SQL提示符下,使用execute語(yǔ)句來(lái)執(zhí)行過(guò)程;另一種是在匿名塊中調(diào)用。
execute執(zhí)行過(guò)程的語(yǔ)法如下:
executeprocedure_name(parameters_list);2)執(zhí)行過(guò)程
創(chuàng)建過(guò)程的時(shí)候并不會(huì)執(zhí)行過(guò)程,必須在【例7.2】
執(zhí)行multiplication過(guò)程。
SQL>setserverouton--將SQL*Plus的輸出打開(kāi)
SQL>executemultiplication--執(zhí)行過(guò)程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過(guò)程已成功完成。
【例7.2】執(zhí)行multiplication過(guò)程。
【例7.3】
在匿名塊中調(diào)用過(guò)程multiplication。
SQL>begin
2multiplication;
3end;
4/
程序運(yùn)行結(jié)果同上。
【例7.3】在匿名塊中調(diào)用過(guò)程multiplicati
2.創(chuàng)建帶參數(shù)的過(guò)程
調(diào)用程序通過(guò)參數(shù)可向被調(diào)用子程序傳遞值。在上述語(yǔ)法[parameterlist]中,參數(shù)的具體形式如下:
<參數(shù)1,[方式1]<數(shù)據(jù)類型1>,
<參數(shù)2,[方式2]<數(shù)據(jù)類型2>,
…
參數(shù)方式有以下三種:
(1)IN表示接受值為默認(rèn)值。
(2)OUT表示將值返回給子程序的調(diào)用程序。
(3)?INOUT表示接受值并返回已更新的值。
2.創(chuàng)建帶參數(shù)的過(guò)程
調(diào)用程序通過(guò)參數(shù)可向被調(diào)用子程參數(shù)的書(shū)寫(xiě)格式為:[(參數(shù)1IN?|?OUT?|?INOUT參數(shù)類型,參數(shù)2
IN?|?OUT?|?INOUT參數(shù)類型,…)]。參數(shù)IN模式是默認(rèn)模式。如果未指定參數(shù)的模式,則認(rèn)為該參數(shù)是IN參數(shù)。對(duì)于OUT和INOUT參數(shù),必須明確指定,并且這兩種類型的參數(shù)在返回到調(diào)用環(huán)境之前必須先賦值。IN參數(shù)可以在調(diào)用時(shí)賦默認(rèn)值,而OUT參數(shù)和INOUT參數(shù)不可以。
參數(shù)的書(shū)寫(xiě)格式為:[(參數(shù)1IN?|?OUT?|?IN1)創(chuàng)建帶IN模式參數(shù)的過(guò)程
【例7.4】
創(chuàng)建一個(gè)過(guò)程,以雇員號(hào)為參數(shù)查詢雇員的姓名和職位。
SQL>createorreplaceprocedurequeryEmpName(sFindNoemp.EmpNo%type)
2as
3sNameemp.ename%type;
4sJobemp.job%type;
5begin
6selectename,jobintosName,sJobfromemp
7whereempno=sFindNo;
8dbms_output.put_line('IDis'||sFindNo||'dezhigongnameis'||1)創(chuàng)建帶IN模式參數(shù)的過(guò)程
【例7.4】創(chuàng)建
9sName||'gongzuois'||sJob);
10exception
11whenno_data_foundthen
12dbms_output.put_line('nodata');
13whentoo_many_rowsthen
14dbms_output.put_line('toomanydata');
15whenothersthen
16dbms_output.put_line('error');
17end;
18/
過(guò)程已創(chuàng)建。
9sName||'g【例7.5】
執(zhí)行queryEmpName過(guò)程。
SQL>execqueryEmpName('7900');
IDis7900dezhigongnameisJAMESgongzuoisCLERK
同樣,也可通過(guò)匿名塊調(diào)用過(guò)程queryEmpName。
SQL>Begin
2queryEmpName('7900');
3end;
4/【例7.5】執(zhí)行queryEmpName過(guò)程。
S2)創(chuàng)建帶OUT模式參數(shù)的過(guò)程
【例7.6】
創(chuàng)建一個(gè)過(guò)程,以雇員號(hào)查詢雇員的薪水。
SQL>createorreplaceprocedurequeryEmpSal(sFindNoemp.EmpNo%type,v_salout
emp.sal%type)
2as
3begin
4selectsalintov_salfromemp
5whereempno=sFindNo;
6dbms_output.put_line('Thesalaryof'||sFindNo||'is:'||v_sal);2)創(chuàng)建帶OUT模式參數(shù)的過(guò)程
【例7.6】創(chuàng)建
7exception
8whenno_data_foundthen
9dbms_output.put_line('nodata');
10whentoo_many_rowsthen
11dbms_output.put_line('toomanydata');
12whenothersthen
13dbms_output.put_line('error');
14end;
/
過(guò)程已創(chuàng)建。
此過(guò)程帶有一個(gè)輸入?yún)?shù)sFindNo和輸出參數(shù)v_sal,程序根據(jù)輸入?yún)?shù)到表中查詢記錄,以返回該員工的薪水值。
7exception
8【例7.7】
執(zhí)行queryEmpSal過(guò)程。
可以聲明一個(gè)變量,用如下的方式調(diào)用該過(guò)程。
SQL>varsalarynumber;
SQL>execqueryEmpSal('7900',:salary);
Thesalaryof7900is:950
PL/SQL過(guò)程已成功完成。
【例7.7】執(zhí)行queryEmpSal過(guò)程。
可以另外,也可以從一個(gè)匿名的PL/SQL程序中執(zhí)行上述過(guò)程,以顯示sal_out變量的輸出結(jié)果。以下代碼可以顯示queryEmpSal過(guò)程的返回值。
Declare
valuenumber;
Begin
queryEmpSal(7934,value);
DBMS_OUTPUT.PUT_LINE('VALUE的值為'||to_char(value));
End;
/
另外,也可以從一個(gè)匿名的PL/SQL程序中執(zhí)行上述過(guò)程,3)創(chuàng)建帶INOUT模式參數(shù)的過(guò)程
【例7.8】
創(chuàng)建兩個(gè)數(shù)進(jìn)行交換的過(guò)程。
SQL>createorreplaceprocedureswap(p1INOUTnumber,p2INOUTnumber)
2as
3tempnumber;
4begin
5temp:=p1;
6p1:=p2;
7p2:=temp;
8end;
9/
SQL>/
過(guò)程已創(chuàng)建。
3)創(chuàng)建帶INOUT模式參數(shù)的過(guò)程
【例7.8】【例7.9】
執(zhí)行swap過(guò)程。
SQL>Declare
2N1number:=10;
3N2number:=20;
4Begin
5swap(N1,N2);
6DBMS_OUTPUT.PUT_LINE('N1的值是'||N1);
7DBMS_OUTPUT.PUT_LINE('N2的值是'||N2);
8End;
9/
N1的值是20
N2的值是10
PL/SQL過(guò)程已成功完成。
【例7.9】執(zhí)行swap過(guò)程。
SQL>Decl
3.過(guò)程的授權(quán)
只有創(chuàng)建過(guò)程的用戶和管理員才有使用過(guò)程的權(quán)限,如以上示例,創(chuàng)建的過(guò)程就像創(chuàng)建的表一樣,屬于當(dāng)前操作的用戶,其他用戶如果要調(diào)用過(guò)程,則需要得到該過(guò)程的EXECUTE權(quán)限,然后通過(guò)點(diǎn)標(biāo)記(dotnotation)(即“用戶名.過(guò)程名”)來(lái)調(diào)用過(guò)程(數(shù)據(jù)字典是user_source)。以下演示如何授權(quán):
SQL>GRANTEXECUTEONswapTOJohn;
SQL>GRANTEXECUTEONqueryEmpNameTOPUBLIC;
前者將swap過(guò)程的執(zhí)行權(quán)限授予John用戶,后者將queryEmpName的執(zhí)行權(quán)限授予所有數(shù)據(jù)庫(kù)用戶。
3.過(guò)程的授權(quán)
只有創(chuàng)建過(guò)程的用戶和管理員才有使用過(guò)
4.刪除過(guò)程
刪除存儲(chǔ)過(guò)程的命令的一般格式如下:
DROPPROCEDURE[<方案名>.]<存儲(chǔ)過(guò)程名>;
【例7.10】
刪除過(guò)程multiplication。
SQL>DROPPROCEDUREmultiplication
過(guò)程已丟棄。
4.刪除過(guò)程
刪除存儲(chǔ)過(guò)程的命令的一般格式如下:
7.1.2函數(shù)
函數(shù)與過(guò)程相似,也是數(shù)據(jù)庫(kù)中存儲(chǔ)的已命名PL/SQL程序塊。與過(guò)程不同的是,函數(shù)除了完成一定的功能外,還必須返回一個(gè)值。
1.創(chuàng)建函數(shù)
創(chuàng)建函數(shù)是指通過(guò)RETURN子句指定函數(shù)返回值的數(shù)據(jù)類型。在函數(shù)體的任何地方,用戶都可以通過(guò)RETURNexpression語(yǔ)句從函數(shù)返回。
7.1.2函數(shù)
函數(shù)與過(guò)程相似,也是數(shù)據(jù)庫(kù)中存儲(chǔ)定義函數(shù)的語(yǔ)法如下:
CREATE[ORREPLACE]FUNCTION[<方案名>.]<函數(shù)名>
[parameterslist]
RETURN<返回值類型>
IS|AS
[local_declarations];
Begin
executablestatements
[exception]
[Exception_handlers]
End;
其中,F(xiàn)UNCTION為PL/SQL函數(shù)的關(guān)鍵字。
定義函數(shù)的語(yǔ)法如下:
CREATE[ORREPL【例7.11】
創(chuàng)建一個(gè)函數(shù),以雇員號(hào)查詢雇員的姓名。
SQL>createorreplacefunctiongetName(snovarchar2)
2returnvarchar
3is
4namevarchar(12);
5begin
6selectenameintonamefromemp
7whereempno=sno;
8returnname;
9exception
10whentoo_many_rowsthen
11dbms_output.put_line('toomanydata');
12whenothersthen
13dbms_output.put_line('error');
14end;
15/
函數(shù)已創(chuàng)建。
【例7.11】創(chuàng)建一個(gè)函數(shù),以雇員號(hào)查詢雇員的姓名。
2.執(zhí)行函數(shù)及授權(quán)
1)在匿名塊中調(diào)用
函數(shù)調(diào)用與過(guò)程調(diào)用很相似,在匿名過(guò)程中通過(guò)函數(shù)名(或參數(shù))可以調(diào)用一個(gè)函數(shù)。因?yàn)檫^(guò)程沒(méi)有顯式的RETURN語(yǔ)句,所以過(guò)程調(diào)用可以是一條單獨(dú)的語(yǔ)句,寫(xiě)在單獨(dú)的行中。而函數(shù)則必須有一個(gè)返回值,所以函數(shù)調(diào)用要借助于可執(zhí)行語(yǔ)句來(lái)完成,例如賦值語(yǔ)句、選擇語(yǔ)句和輸出語(yǔ)句。下面的例子通過(guò)匿名過(guò)程調(diào)用getname函數(shù),將雇員號(hào)作為參數(shù),此函數(shù)將雇員姓名傳給調(diào)用塊,然后顯示雇員姓名。
2.執(zhí)行函數(shù)及授權(quán)
1)在匿名塊中調(diào)用
函數(shù)調(diào)【例7.12】
通過(guò)匿名過(guò)程調(diào)用getname函數(shù)。
SQL>declare
2namevarchar(12);
3begin
4name:=getname('7902');
5dbms_output.put_line(name);
6end;
7/
FORD
PL/SQL過(guò)程已成功完成。
【例7.12】通過(guò)匿名過(guò)程調(diào)用getname函數(shù)。
2)在SQL語(yǔ)句中調(diào)用
除了在匿名塊中調(diào)用外,也可以在SQL語(yǔ)句中調(diào)用函數(shù)。
【例7.13】
在SQL語(yǔ)句中調(diào)用getname,顯示雇員號(hào)為“7369”的雇員姓名。
SQL>selectgetname('7369')fromdual;
GETNAME('7369')
------------------------
SMITH2)在SQL語(yǔ)句中調(diào)用
除了在匿名塊中調(diào)用外,也可【例7.14】
從雇員表中查找雇員號(hào)為“7369”的雇員信息。
SQL>Select*fromempwhereename=getname(‘7369’);
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
--------------------------------------------------
7369SMITHCLERK??790217-12月-8080020
【例7.14】從雇員表中查找雇員號(hào)為“7369”的雇員
3.函數(shù)的授權(quán)
與過(guò)程一樣,只有創(chuàng)建函數(shù)的用戶和管理員才有權(quán)使用函數(shù),其他用戶如果要調(diào)用函數(shù),則需要得到該函數(shù)的EXECUTE權(quán)限。
【例7.15】
將getname函數(shù)的執(zhí)行權(quán)限授予John用戶。
SQL>GRANTEXECUTEONgetnameTOJohn;3.函數(shù)的授權(quán)
與過(guò)程一樣,只有創(chuàng)建函數(shù)的用戶和管理
4.刪除函數(shù)
刪除函數(shù)的命令的一般格式如下:
DROPFUNCTION[<方案名>.]<函數(shù)名>;
【例7.16】
刪除函數(shù)getname。
SQL>DROPFUNCTIONgetname;4.刪除函數(shù)
刪除函數(shù)的命令的一般格式如下:
D7.1.3過(guò)程和函數(shù)的比較
表7-1過(guò)程和函數(shù)的比較
7.1.3過(guò)程和函數(shù)的比較
表7-1過(guò)程和函 7.2程
序
包
7.2.1程序包概述
程序包是數(shù)據(jù)庫(kù)中的一個(gè)實(shí)體,包含一系列公共常量、變量、數(shù)據(jù)類型、游標(biāo)、過(guò)程及函數(shù)的定義。使用包更加體現(xiàn)了模塊化編程的優(yōu)點(diǎn),使得開(kāi)發(fā)工作能靈活自如地進(jìn)行。程序包包括兩個(gè)部分:程序包規(guī)范說(shuō)明部分和程序包主體部分。
7.2程序包
7.2.1程序包概述
1.程序包規(guī)范說(shuō)明部分
該部分相當(dāng)于一個(gè)包的頭,類似于接口,可以對(duì)包的部件作簡(jiǎn)單說(shuō)明。其中的過(guò)程、函數(shù)、變量、常量和游標(biāo)都是公共的,可在應(yīng)用程序中訪問(wèn)。
(1)
使用createpackage進(jìn)行創(chuàng)建。
(2)
包含公用對(duì)象和類型。
(3)
聲明類型、變量、常量、異常、游標(biāo)和子程序。
(4)
?可以在沒(méi)有程序包主體部分的情況下存在。
1.程序包規(guī)范說(shuō)明部分
該部分相當(dāng)于一個(gè)包的頭,類似
2.程序包主體部分
(1)
使用createpackagebody進(jìn)行創(chuàng)建。
(2)
包含子程序和游標(biāo)的定義。
(3)
包含私有聲明。
(4)
?不能在沒(méi)有程序包規(guī)格說(shuō)明的情況下存在。
2.程序包主體部分
(1)
使用createpac
7.2.2創(chuàng)建程序包
程序包包括兩部分:規(guī)范和主體。規(guī)范是程序包的公共接口;主體是規(guī)范的實(shí)現(xiàn),以及私有例程、數(shù)據(jù)和變量。
1.創(chuàng)建程序包規(guī)范
CREATEORREPLACEPACKAGEpackage_name
IS|AS
公用類型或變量常量的聲明;
公用過(guò)程或函數(shù)的聲明;
ENDpackage_name;
/7.2.2創(chuàng)建程序包
程序包包括兩部分:規(guī)范和主
2.創(chuàng)建程序包主體
CREATEORREPLACEPACKAGEBODYpackage_name
IS|AS
私有類型或變量常量的聲明;
公用過(guò)程或函數(shù)的實(shí)現(xiàn);
ENDpackage_name
規(guī)范是程序包的接口,規(guī)范中定義的所有內(nèi)容都可以由調(diào)用者使用(當(dāng)然需要具有EXECUTE特權(quán)),比如規(guī)范中定義的過(guò)程函數(shù)可以被執(zhí)行,類型可以被訪問(wèn),變量可以被引用。
2.創(chuàng)建程序包主體
CREATEORREPLAC【例7.17】
使用兩個(gè)過(guò)程print_ename()和print_sal(),定義名為employee_pkg的程序包。
SQL>CREATEORREPLACE
2PACKAGEemployee_pkgas
3Procedureprint_ename(p_empnonumber);
4Procedureprint_sal(p_empnonumber);
5End;
6/
程序包已創(chuàng)建。
【例7.17】?使用兩個(gè)過(guò)程print_ename()此時(shí)并沒(méi)有為過(guò)程提供代碼,只是定義了名稱和參數(shù)。
這個(gè)時(shí)候如果試圖使用這個(gè)包,則會(huì)報(bào)錯(cuò)。
SQL>execemployee_pkg.print_ename(1234);
ERROR位于第1行:
ORA-04068:已丟棄程序包的當(dāng)前狀態(tài)
ORA-04067:未執(zhí)行,packagebody"SCOTT.EMPLOYEE_PKG"不存在
ORA-06508:PL/SQL:無(wú)法在調(diào)用之前找到程序單元
ORA-06512:在line1此時(shí)并沒(méi)有為過(guò)程提供代碼,只是定義了名稱和參數(shù)。這個(gè)時(shí)程序包是過(guò)程函數(shù)的具體實(shí)現(xiàn)部分,實(shí)現(xiàn)規(guī)范中定義的接口。
SQL>CREATEORREPLACE
2PACKAGEBODYemployee_pkgas
3Procedureprint_ename(p_empnonumber)is
4L_enameemp.ename%type;
5Begin
6Selectenameintol_enamefromempwhereempno=p_empno;
7Dbms_output.put_line(l_ename);程序包是過(guò)程函數(shù)的具體實(shí)現(xiàn)部分,實(shí)現(xiàn)規(guī)范中定義的接口。
8Exception
9Whenno_data_foundthen
10Dbms_output.put_line('Invalidemployeenumber');
11Endprint_ename;
12Procedureprint_sal(p_empnonumber)is
13L_salemp.sal%type;
14Begin
15Selectsalintol_salfromempwhereempno=p_empno;
16Dbms_output.put_line(l_sal);8Exception
9
17Exception
18WhenNO_DATA_FOUNDthen
19Dbms_output.put_line('Invalidemployeenumber');
20Endprint_sal;
21Endemployee_pkg;
22/
程序包主體已創(chuàng)建。
17Exception
187.2.3執(zhí)行程序包
執(zhí)行程序包中的過(guò)程可以使用如下語(yǔ)句:
EXECUTE包名.過(guò)程名
【例7.18】
執(zhí)行employee_pkg包里的print_ename過(guò)程。
SQL>setserveroutputon
SQL>execemployee_pkg.print_ename(7782);
運(yùn)行結(jié)果如下:
CLARK
PL/SQL過(guò)程已成功完成。
SQL>execemployee_pkg.print_sal(7782);
運(yùn)行結(jié)果如下:
2450
PL/SQL過(guò)程已成功完成。
執(zhí)行程序包中的函數(shù)可以通過(guò)一段代碼塊來(lái)實(shí)現(xiàn)。
7.2.3執(zhí)行程序包
執(zhí)行程序包中的過(guò)程可以使用如下
7.2.4程序包中的游標(biāo)
程序包中可以定義和使用游標(biāo)。游標(biāo)的定義分為游標(biāo)規(guī)范和游標(biāo)主體兩部分。在游標(biāo)規(guī)范說(shuō)明部分必須通過(guò)RETURN語(yǔ)句指定游標(biāo)的返回類型。RETURN語(yǔ)句指定游標(biāo)獲取和返回的數(shù)據(jù)元素由select語(yǔ)句確定。select語(yǔ)句只出現(xiàn)在主體定義中,而不出現(xiàn)在規(guī)范說(shuō)明中。
7.2.4程序包中的游標(biāo)
程序包中可以定義和使用【例7.19】
下面使用程序包中的游標(biāo)。student_package程序包中包含4個(gè)過(guò)程和1個(gè)函數(shù)。其中,select_student過(guò)程中使用了游標(biāo)。詳細(xì)過(guò)程如下:
(1)首先創(chuàng)建student表結(jié)構(gòu)。
SQL>createtablestudent(stuidvarchar2(4),stunamevarchar2(10),sechar(1));
表已創(chuàng)建。
【例7.19】下面使用程序包中的游標(biāo)。student_
(2)定義聲明。
SQL>createorreplacepackagestudent_packageis
2typestudent_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)建。
(2)定義聲明。
SQL>createorr
(3)定義主體。
SQL>createorreplacepackagebodystudent_packageis
2procedureinsert_student(stustudent%rowtype)is
3icountint;
4begin
5selectcount(*)intoicountfromstudentwherestuid=stu.stuid;
6ificount>0then
7dbms_output.put_line('insertdataisalreadyexsist');
8else
9insertintostudentvalues(stu.stuid,stu.stuname,stu.se);
10commit;
11endif;(3)定義主體。
SQL>createorr
12exception
13whentoo_many_rowsthen
14dbms_output.put_line('insertdataisalreadyexsist');
15endinsert_student;
16procedureupdate_student(stustudent%rowtype)is
17icountint;
18begin
19selectcount(*)intoicountfromstudentwherestuid=stu.stuid;
20ificount>0then
21updatestudentsetstuname=stu.stuname,se=stu.sewherestuid=stu.stuid;12exception
13whe
22commit;
23else
24dbms_output.put_line('updatedatanotexist!');
25endif;
26endupdate_student;
27proceduredelete_student(snostudent.stuid%type)is
28icountint;
29begin
30ificount>0then
31deletefromstudentwherestuid=sno;
32commit;
33else22commit;
23els
34dbms_output.put_line('deletedatanotexist');
35endif;
36enddelete_student;
37procedureselect_student(stucurinoutstudent_cur)is
38begin
39openstucurforselect*fromstudent;
40endselect_student;
41functiongetStudentCountreturnnumberis
42icountint;
43begin
44selectcount(*)intoicountfromstudent;
45returnicount;
46endgetStudentCount;
47endstudent_package;
48/
程序包主體已創(chuàng)建。
34dbms_output.put_line
(4)調(diào)用程序包插入一行數(shù)據(jù)。
SQL>declare
2stustudent%rowtype;
3begin
4stu.stuid:=1009;
5stu.stuname:='tonglei';
6stu.se:='f';
7student_package.insert_student(stu);
8end;
9/
PL/SQL過(guò)程已成功完成。
(4)調(diào)用程序包插入一行數(shù)據(jù)。
SQL>decl
(5)調(diào)用程序包中的過(guò)程select_student顯示數(shù)據(jù)。
SQL>varssrefcursor--定義游標(biāo)變量
SQL>execstudent_package.select_student(:ss);
PL/SQL過(guò)程已成功完成。
顯示游標(biāo)變量?jī)?nèi)容如下:
SQL>printss
STUISTUNAMES
-----------------
1009tongleif(5)調(diào)用程序包中的過(guò)程select_student顯7.2.5程序包的優(yōu)點(diǎn)
程序包的優(yōu)點(diǎn)如下:
(1)
模塊化。包可以使邏輯上相關(guān)聯(lián)的類型、項(xiàng)目和子程序等封裝進(jìn)一個(gè)命名PL/SQL塊中。每個(gè)包劃分功能清晰,包的接口簡(jiǎn)單、明了。
(2)可重用性。一旦命名并保存在數(shù)據(jù)庫(kù)中,任何應(yīng)用都可以使用。
(3)簡(jiǎn)單的應(yīng)用程序設(shè)計(jì)。當(dāng)設(shè)計(jì)應(yīng)用程序時(shí),只需知道包的接口部分的信息,可以只創(chuàng)建并編譯包的規(guī)范而不創(chuàng)建包體。同樣可以在程序中引用包,等整個(gè)應(yīng)用程序完成后再來(lái)定義具體的包體。
7.2.5程序包的優(yōu)點(diǎn)
程序包的優(yōu)點(diǎn)如下:
(1
(4)
抽象和數(shù)據(jù)隱藏。可以指定公有信息和私有信息。只有公有信息才可以被外部應(yīng)用程序訪問(wèn)。
(5)
更好的執(zhí)行效能。包里的子程序第一次被調(diào)用時(shí),整個(gè)包被調(diào)到內(nèi)存中,以后的調(diào)用就可以直接從內(nèi)存中讀取。這樣可以減少不必要的重新編譯。
(4)
抽象和數(shù)據(jù)隱藏。可以指定公有信息和私有信息。只有
7.2.6有關(guān)子程序和程序包的信息
子程序和程序包是數(shù)據(jù)庫(kù)中存儲(chǔ)的對(duì)象,Oracle會(huì)在數(shù)據(jù)字典中存儲(chǔ)所有對(duì)象的信息。通過(guò)查詢數(shù)據(jù)字典可以獲得它們的信息。通過(guò)查詢USER_OBJECTS數(shù)據(jù)字典視圖可以獲取有關(guān)在會(huì)話中創(chuàng)建的字程序和程序包的信息。
7.2.6有關(guān)子程序和程序包的信息
子程序和程序【例7.20】
獲取程序包中子程序和程序包的信息。
SQL>COLUMNOBJECT_NAMEFORMATA18
SQL>SELECTOBJECT_NAME,OBJECT_TYPEFROMUSER_OBJECTSWHERE
OBJECT_TYPEIN('PROCEDURE','FUNCTION','PACKAGE','PACKAGEBODY');
OBJECT_NAMEOBJECT_TYPE
---------------------------
EMPLOYEE_PKGPACKAGE
EMPLOYEE_PKGPACKAGEBODY
QUERYEMPNAMEPROCEDURE
QUERYEMPSALPROCEDURE
SWAPPROCEDURE【例7.20】獲取程序包中子程序和程序包的信息。
【例7.21】
要獲取存儲(chǔ)子程序的文本,可以查詢USER_SOURCE。
SQL>COLUMNLINEFORMAT9999
SQL>COLUMNTEXTFORA50
SQL>SELECTLINE,TEXTFROMUSER_SOURCEWHERENAME=’SWAP’;
LINETEXT
-------------------------------------------
1procedureswap(p1INOUTnumber,p2INOUTnumber)
2as
3tempnumber;
4begin
5temp:=p1;
6p1:=p2;
7p2:=temp;
8end;【例7.21】要獲取存儲(chǔ)子程序的文本,可以查詢USER【例7.22】
獲得程序包中子程序規(guī)范employee_pkg信息。
SQL>DESCemployee_pkg;
PROCEDUREPRINT_ENAME【例7.22】獲得程序包中子程序規(guī)范employee_ 7.3小
結(jié)
過(guò)程、函數(shù)和子程序都可以用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)的操作,可以帶上用戶自定義的參數(shù)。它們封裝了數(shù)據(jù)類型定義、變量說(shuō)明、游標(biāo)、異常等,方便了用戶管理操縱數(shù)據(jù)庫(kù)數(shù)據(jù)。
7.3小結(jié)
過(guò)程、函數(shù)和子程序都可
習(xí)題七
一、選擇題
1.執(zhí)行特定任務(wù)的子程序是()。
A.函數(shù) B.過(guò)程C.程序包D.游標(biāo)
2.子程序的()模式參數(shù)可以在調(diào)用子程序時(shí)指定一個(gè)常量。
A.IN B.OUT C.INOUT
3.如果存儲(chǔ)過(guò)程的參數(shù)類型為OUT,那么調(diào)用時(shí)傳遞的參數(shù)應(yīng)該為()。
A.常量 B.表達(dá)式 C.變量 D.都可以
習(xí)題七
一、選擇題
1.執(zhí)行特定任務(wù)的子程
4.下列有關(guān)存儲(chǔ)過(guò)程的特點(diǎn),說(shuō)法錯(cuò)誤的是()。
A.存儲(chǔ)過(guò)程不能將值傳回調(diào)用的主程序
B.存儲(chǔ)過(guò)程是一個(gè)命名的模塊
C.編譯的存儲(chǔ)過(guò)程存放在數(shù)據(jù)庫(kù)中
D.一個(gè)存儲(chǔ)過(guò)程可以調(diào)用另一個(gè)存儲(chǔ)過(guò)程
5.包中不能包含的元素為()。
A.存儲(chǔ)過(guò)程 B.存儲(chǔ)函數(shù) C.游標(biāo) D.表
4.下列有關(guān)存儲(chǔ)過(guò)程的特點(diǎn),說(shuō)法錯(cuò)誤的是()。
6.下列有關(guān)包的使用,說(shuō)法錯(cuò)誤的是()。
A.在不同的包內(nèi)模塊可以重名
B.包的私有過(guò)程不能被外部程序調(diào)用
C.包體中的過(guò)程和函數(shù)必須在包頭部分說(shuō)明
D.必須先創(chuàng)建包頭,然后創(chuàng)建包體
6.下列有關(guān)包的使用,說(shuō)法錯(cuò)誤的是()。
A.二、編程題
1.編寫(xiě)程序包,此程序包有兩個(gè)過(guò)程和一個(gè)函數(shù),第一個(gè)過(guò)程根據(jù)職員編號(hào)打印職員姓名,第二個(gè)過(guò)程根據(jù)職員編號(hào)打印職員的部門(mén)編號(hào)。函數(shù)根據(jù)職員編號(hào)返回職員的薪水。
提示:使用scott用戶的emp表作為數(shù)據(jù)源。
2.編寫(xiě)函數(shù)接受學(xué)生的學(xué)號(hào),并計(jì)算該學(xué)生3門(mén)課程的總分。
3.編寫(xiě)一個(gè)過(guò)程,將10號(hào)部門(mén)員工薪水上漲10%,20號(hào)部門(mén)員工薪水上漲20%,其他部門(mén)員工薪水保持不變。
二、編程題
1.編寫(xiě)程序包,此程序包有兩個(gè)過(guò)程和一個(gè) 上機(jī)實(shí)驗(yàn)七
實(shí)驗(yàn)1過(guò)程
目的和要求:
1.掌握編寫(xiě)過(guò)程的方法。
2.掌握調(diào)用過(guò)程的方法。
實(shí)驗(yàn)內(nèi)容:
編寫(xiě)一個(gè)過(guò)程,要求根據(jù)用戶輸入的員工號(hào)(emp_no)查詢EMP表,返回員工的姓名和工作職位(empName和empJob)。并編寫(xiě)一個(gè)匿名塊調(diào)用此過(guò)程(使用SCOTT用戶的EMP表)。
上機(jī)實(shí)驗(yàn)七
實(shí)驗(yàn)1過(guò)程
目的和要求:
SQL>createorreplaceprocedurepro_emp(emp_nonumber)
2as
3empNamevarchar2(20);
4empJobvarchar2(20);
5begin
6selectename,jobintoempName,empJobfromempwhereempno=emp_no;
7DBMS_OUTPUT.PUT_LINE('雇員的姓名是:'||empName);
8DBMS_OUTPUT.PUT_LINE('雇員的職位是:'||empJob);
9EXCEPTION
10whenNO_DATA_FOUNDthen
11DBMS_OUTPUT.PUT_LINE('雇員編號(hào)未找到!');
12endpro_emp;
13/SQL>createorreplaceproce過(guò)程已創(chuàng)建。
SQL>setserveroutputon;
SQL>executepro_emp(7369);
雇員的姓名是:SMITH
雇員的職位是:CLERK
PL/SQL過(guò)程已成功完成。
過(guò)程已創(chuàng)建。
SQL>setserveroutp實(shí)驗(yàn)2函數(shù)
目的和要求:
1.掌握編寫(xiě)函數(shù)的方法。
2.掌握調(diào)用函數(shù)的方法。
實(shí)驗(yàn)2函數(shù)
目的和要求:
1.掌握編寫(xiě)函數(shù)的
實(shí)驗(yàn)內(nèi)容:
1.編寫(xiě)函數(shù)以接受學(xué)生的學(xué)號(hào),并計(jì)算此學(xué)生3門(mén)課程的平均分。
SQL>createorreplacefunctionfun_score(student_nonumber)
2returnfloat
3as
4s1float(10);
5s2float(10);
6s3float(10);
7score_avgfloat(10);
8begin
9selectoracle,java,csharpintos1,s2,s3fromscorewherestuID=student_no;
實(shí)驗(yàn)內(nèi)容:
1.編寫(xiě)函數(shù)以接受學(xué)生的學(xué)號(hào),并計(jì)算此學(xué)
10score_avg:=(s1+s2+s3)/3.0;
11returnscore_avg;
12EXCEPTION
13whenNO_DATA_FOUNDthen
14DBMS_OUTPUT.PUT_LINE('學(xué)號(hào)未找到!');
15end;
16/
函數(shù)已創(chuàng)建。
SQL>setserveroutputon;
SQL>declare10score_avg:=(s1+s2+s3)
2score_avgfloat(10);
3begin
4score_avg:=fun_score(1);
5DBMS_OUTPUT.PUT_LINE('該學(xué)生的成績(jī)是:'||score_avg);
6end;
7/
該學(xué)生的成績(jī)是:62.67
PL/SQL過(guò)程已成功完成。
2score_avgfloat(10);
2.編寫(xiě)一個(gè)函數(shù),要求根據(jù)用戶輸入的部門(mén)號(hào)查詢DEPT表。如果存在這個(gè)部門(mén)號(hào),則返回TRUE,否則返回FALSE。在調(diào)用程序中根據(jù)結(jié)果顯示正確的消息(使用SCOTT用戶的DEPT表)。
2.編寫(xiě)一個(gè)函數(shù),要求根據(jù)用戶輸入的部門(mén)號(hào)查詢DEPT表
實(shí)驗(yàn)3程序包
目的和要求:
1.掌握程序包的編寫(xiě)規(guī)范。
2.掌握?qǐng)?zhí)行程序包中過(guò)程和函數(shù)的方法。
實(shí)驗(yàn)內(nèi)容:
1.編寫(xiě)一個(gè)程序包,此程序包有一個(gè)過(guò)程和一個(gè)函數(shù)。過(guò)程根據(jù)職員編號(hào)打印薪水。函數(shù)根據(jù)職員編號(hào)返回職員的就職日期。編寫(xiě)調(diào)用程序執(zhí)行(使用SCOTT用戶的emp表)。
實(shí)驗(yàn)3程序包
目的和要求:
1.掌握程序包的
SQL>createorreplacepackagepack_emp
2is
3procedurepro_salary(emp_nonumber);
4functionfun_date(emp_nonumber)returndate;
5endpack_emp;
6/
程序包已創(chuàng)建。
SQL>createorreplacepackagebodypack_emp
2as
3procedurepro_salary(emp_nonumber)
4isSQL>createorreplacepack
5salarynumber(20);
6begin
7selectsalintosalaryfromempwhereempno=emp_no;
8DBMS_OUTPUT.PUT_LINE('該職員的薪水是:'||salary);
9EXCEPTION
10whenNO_DATA_FOUNDthen
11DBMS_OUTPUT.PUT_LINE('職員編號(hào)未找到!');
12endpro_salary;
13functionfun_date(emp_nonumber)
14returndate
15is
16h_datedate;5salarynumber(20)
17begin
18selecthiredateintoh_datefromempwhereempno=emp_no;
19returnh_date;
20EXCEPTION
21whenNO_DATA_FOUNDthen
22DBMS_OUTPUT.PUT_LINE('職員編號(hào)未找到!');
23endfun_date;
24endpack_emp;
25/17begin
18se程序包主體已創(chuàng)建。
SQL>setserveroutputon;
SQL>executepack__salary(7369);
該職員的薪水是:800
PL/SQL過(guò)程已成功完成。
SQL>setserveroutputon;
SQL>declare
2h_datedate;
3begin
4h_date:=pack_emp.fun_date(7369);程序包主體已創(chuàng)建。
SQL>setserver
5DBMS_OUTPUT.PUT_LINE('該職員的就職日期是:'||h_date);
6end;
7/
該職員的就職日期是:17-12月-80
PL/SQL過(guò)程已成功完成。
5DBMS_OUTPUT.PUT_L
2.編寫(xiě)一個(gè)程序包,此程序包有一個(gè)過(guò)程和一個(gè)函數(shù)。過(guò)程利用傳入?yún)?shù)傳入員工的工作職位(emp表JOB字段),顯示該職位中的員工數(shù)量。函數(shù)利用傳入?yún)?shù)傳入員工的工作職位,返回該職位中的員工數(shù)量。編寫(xiě)調(diào)用程序執(zhí)行(使用SCOTT用戶的emp表)。
2.編寫(xiě)一個(gè)程序包,此程序包有一個(gè)過(guò)程和一個(gè)函數(shù)。過(guò)程利第7章
過(guò)程、函數(shù)和程序包
7.1子程序
7.2程序包
7.3小結(jié)
習(xí)題七
上機(jī)實(shí)驗(yàn)七
第7章過(guò)程、函數(shù)和程序包7.1子程序 7.1子程序
以前我們寫(xiě)的PL/SQL語(yǔ)句程序都是瞬時(shí)的,都沒(méi)有命名。其缺點(diǎn)是:在每次執(zhí)行的時(shí)候都要被編譯,并且不能被存儲(chǔ)在數(shù)據(jù)庫(kù)中,其他PL/SQL塊也無(wú)法調(diào)用它們。現(xiàn)在我們把命名的PL/SQL塊叫做子程序,它們存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以為它們指定參數(shù),可以在數(shù)據(jù)庫(kù)客戶端和應(yīng)用程序中調(diào)用。命名的PL/SQL程序包括存儲(chǔ)過(guò)程和函數(shù)。程序包是存儲(chǔ)過(guò)程和函數(shù)的集合。
子程序結(jié)構(gòu)與PL/SQL匿名塊的相同點(diǎn)在于都由聲明、執(zhí)行、異常三大部分構(gòu)成,不同之處在于,PL/SQL匿名塊的聲明可選,而子程序的聲明則是必需的。 7.1子程序
以前我們寫(xiě)的PL/SQL子程序的優(yōu)點(diǎn)如下:
(1)模塊化:通過(guò)子程序可以將程序分解為可管理的、明確的邏輯模塊。
(2)可重用性:子程序在創(chuàng)建并執(zhí)行后,就可以在任何應(yīng)用程序中使用。
(3)可維護(hù)性:子程序可以簡(jiǎn)化維護(hù)操作。
(4)安全性:用戶可以設(shè)置權(quán)限,保護(hù)子程序中的數(shù)據(jù),只能讓用戶提供的過(guò)程和函數(shù)訪問(wèn)數(shù)據(jù)。這不僅可以讓數(shù)據(jù)更加安全,同時(shí)可保證正確性。
子程序有兩種類型:過(guò)程和函數(shù)。其中,過(guò)程用于執(zhí)行某項(xiàng)操作;函數(shù)用于執(zhí)行某項(xiàng)操作并返回值。
子程序的優(yōu)點(diǎn)如下:
(1)模塊化:通過(guò)子程序可以將7.1.1過(guò)程
1.過(guò)程的創(chuàng)建和執(zhí)行
過(guò)程可使用createprocedure語(yǔ)句創(chuàng)建,語(yǔ)法如下:
createorreplaceprocedure[<方案名>.]<存儲(chǔ)過(guò)程名>
[parameterlist]
{Is|as}
[local_declarations];
Begin
executablestatements
[exception]
[Exception_handlers]
End[procedure_name];
7.1.1過(guò)程
1.過(guò)程的創(chuàng)建和執(zhí)行
過(guò)程可使用保留字Is前面的過(guò)程定義稱為過(guò)程頭。
過(guò)程頭包括過(guò)程名和具有數(shù)據(jù)類型的參數(shù)列表。過(guò)程體包括聲明部分、執(zhí)行部分和異常處理部分。過(guò)程體從保留字Is之后開(kāi)始。其中,聲明部分和異常處理部分是可選的;
執(zhí)行部分至少包含一條語(yǔ)句。這里的Is|as就相當(dāng)于declare聲明部分,除了擁有前面的一個(gè)過(guò)程聲明語(yǔ)句外,其他和以前的匿名PL/SQL塊一樣。其中,replace表示在創(chuàng)建存儲(chǔ)過(guò)程中,如果已經(jīng)存在同名的存儲(chǔ)過(guò)程,則重新創(chuàng)建;如果沒(méi)有此關(guān)鍵詞,則當(dāng)數(shù)據(jù)庫(kù)中有同名的過(guò)程時(shí)會(huì)報(bào)錯(cuò)“ORA-00955號(hào)錯(cuò)誤:名稱已被現(xiàn)有對(duì)象占用”。必須將同名的過(guò)程刪除后才能創(chuàng)建。
保留字Is前面的過(guò)程定義稱為過(guò)程頭。?過(guò)程頭包括過(guò)程名和1)創(chuàng)建不帶參數(shù)的過(guò)程。
【例7.1】
創(chuàng)建一個(gè)過(guò)程multiplication,用來(lái)實(shí)現(xiàn)九九乘法表。
SQL>createorreplaceproceduremultiplication
2as
3iinteger;
4jinteger;
5begin
6dbms_output.put_line('printmultiplication');
7foriin1..9loop
8forjin1..9loop
9ifi>=jthen1)創(chuàng)建不帶參數(shù)的過(guò)程。
【例7.1】創(chuàng)建一個(gè)過(guò)
10dbms_output.put(to_char(j)||'*'||
11to_char(i)||'='||to_char(i*j)||'');
12endif;
13endloop;
14dbms_output.put_line('');
15endloop;
16end;
17/
過(guò)程已創(chuàng)建。
出現(xiàn)編譯錯(cuò)誤的時(shí)候可以用showerror或者descuser_errors來(lái)調(diào)試。
10dbms_output.put(2)執(zhí)行過(guò)程
創(chuàng)建過(guò)程的時(shí)候并不會(huì)執(zhí)行過(guò)程,必須在這之后調(diào)用過(guò)程來(lái)執(zhí)行。執(zhí)行過(guò)程的方法有兩種:一種是在SQL提示符下,使用execute語(yǔ)句來(lái)執(zhí)行過(guò)程;另一種是在匿名塊中調(diào)用。
execute執(zhí)行過(guò)程的語(yǔ)法如下:
executeprocedure_name(parameters_list);2)執(zhí)行過(guò)程
創(chuàng)建過(guò)程的時(shí)候并不會(huì)執(zhí)行過(guò)程,必須在【例7.2】
執(zhí)行multiplication過(guò)程。
SQL>setserverouton--將SQL*Plus的輸出打開(kāi)
SQL>executemultiplication--執(zhí)行過(guò)程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過(guò)程已成功完成。
【例7.2】執(zhí)行multiplication過(guò)程。
【例7.3】
在匿名塊中調(diào)用過(guò)程multiplication。
SQL>begin
2multiplication;
3end;
4/
程序運(yùn)行結(jié)果同上。
【例7.3】在匿名塊中調(diào)用過(guò)程multiplicati
2.創(chuàng)建帶參數(shù)的過(guò)程
調(diào)用程序通過(guò)參數(shù)可向被調(diào)用子程序傳遞值。在上述語(yǔ)法[parameterlist]中,參數(shù)的具體形式如下:
<參數(shù)1,[方式1]<數(shù)據(jù)類型1>,
<參數(shù)2,[方式2]<數(shù)據(jù)類型2>,
…
參數(shù)方式有以下三種:
(1)IN表示接受值為默認(rèn)值。
(2)OUT表示將值返回給子程序的調(diào)用程序。
(3)?INOUT表示接受值并返回已更新的值。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建泉州市2025年高二下化學(xué)期末達(dá)標(biāo)檢測(cè)試題含解析
- 機(jī)耕道路維護(hù)管理辦法
- 內(nèi)部成員沖突管理辦法
- 杭州學(xué)校宿舍管理辦法
- 民企職工公寓管理辦法
- 新疆引進(jìn)資金管理辦法
- 江西房產(chǎn)經(jīng)紀(jì)管理辦法
- 酵母代謝通路優(yōu)化-洞察及研究
- 汽配倉(cāng)儲(chǔ)采購(gòu)管理辦法
- 張掖地區(qū)文冠果高效培育技術(shù)探討
- 國(guó)開(kāi)大學(xué)2023年01月22503《學(xué)前兒童健康教育活動(dòng)指導(dǎo)》期末考試答案
- 建筑工地九牌一圖內(nèi)容僅供參考模板
- 發(fā)熱性疾病處理思路
- 12J4-1 《常用門(mén)窗》標(biāo)準(zhǔn)圖集
- GB/T 19802-2005無(wú)損檢測(cè)工業(yè)射線照相觀片燈最低要求
- 粘包鋼加固施工方案
- 思想道德與法治課件:第六章 第四節(jié) 自覺(jué)尊法學(xué)法守法用法
- 錐坡工程量計(jì)算
- T∕CACM 1064-2018 針刀醫(yī)學(xué)臨床 通用要求
- 加油站加油機(jī)風(fēng)險(xiǎn)告知卡
- 空調(diào)設(shè)計(jì)通用氣象參數(shù)
評(píng)論
0/150
提交評(píng)論