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

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論