版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第7章PL/SQL編程 PL/SQL編程7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)7.2PL/SQL程序結(jié)構(gòu)構(gòu)7.3異常處理理7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)7.1.1PL/SQL語(yǔ)言優(yōu)點(diǎn)點(diǎn)PL/SQL是一種高高效的事事務(wù)處理理語(yǔ)言,它具備備以下優(yōu)優(yōu)點(diǎn):PL/SQL是一種高高性能的的基于事務(wù)務(wù)處理的語(yǔ)言,能運(yùn)行行在任何何Oracle環(huán)境中,支持所所有數(shù)據(jù)據(jù)處理命命令。通通過(guò)使用用PL/SQL程序單元元處理SQL的數(shù)據(jù)定定義和數(shù)數(shù)據(jù)控制制元素。PL/SQL支持所有有SQL數(shù)據(jù)類型型和所有有SQL函數(shù),同同時(shí)支持持所有Oracle對(duì)象類型型。PL/SQL塊可以被被命名并并存儲(chǔ)在在Oracle服務(wù)器中中,同時(shí)時(shí)也能被
2、被其他PL/SQL程序或SQL命令調(diào)用用,任何何客戶/服務(wù)器工工具都能能訪問(wèn)PL/SQL程序,具具有很好好的可重重用性??梢允褂糜肙racle數(shù)據(jù)工具具管理PL/SQL程序的安安全性??梢允谑跈?quán)或撤撤銷數(shù)據(jù)據(jù)庫(kù)其他他用戶訪訪問(wèn)PL/SQL程序權(quán)限限。7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)PL/SQL代碼可以以使用任任何ASCII文本編輯輯器編寫(xiě)寫(xiě),所以以對(duì)任何何能夠運(yùn)運(yùn)行Oracle的操作系系統(tǒng)都是是非常便便利的。對(duì)于SQL,Oracle必須在同同一時(shí)間間處理每每一條SQL語(yǔ)句,在在網(wǎng)絡(luò)環(huán)環(huán)境下這這就意味味著每一一個(gè)獨(dú)立立的調(diào)用用都必須須被Oracle服務(wù)器處處理,從從而占用用大量的的服務(wù)器器時(shí)間,導(dǎo)致
3、網(wǎng)網(wǎng)絡(luò)擁擠擠。而PL/SQL以整個(gè)語(yǔ)語(yǔ)句塊形形式發(fā)給給服務(wù)器器,可以以減少網(wǎng)網(wǎng)絡(luò)擁擠擠。7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)7.1.2PL/SQL的基本結(jié)結(jié)構(gòu)一個(gè)PL/SQL程序包含含一個(gè)或或多個(gè)邏邏輯塊,每個(gè)塊塊都可以以劃分為為三個(gè)部部分:聲聲明部分分(用DECLARE開(kāi)頭)、執(zhí)行部部分(以以BEGIN開(kāi)頭)和和異常處處理部分分(以EXCEPTION開(kāi)頭)1、PL/SQL基本結(jié)構(gòu)構(gòu)如下:DECLARE聲明部分分BEGIN執(zhí)行部分分EXCEPTION異常處理理部分END;7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)其中:聲明部分分:定義義變量和和常量的的數(shù)據(jù)類類型和初初始值,以及程程序中要要使用的的函數(shù)、游標(biāo)、異常處
4、處理名稱稱等。如如果沒(méi)有有需要聲聲明的內(nèi)內(nèi)容,可可以省略略這一部部分。PL/SQL中要使用用的所有有定義都都必須在在這一部部分進(jìn)行行集中定定義。執(zhí)行部分分:此部部分是PL/SQL塊中的指指令部分分,所有有的可執(zhí)執(zhí)行語(yǔ)句句都放在在這一部部分,包包括對(duì)數(shù)數(shù)據(jù)庫(kù)的的操作語(yǔ)語(yǔ)句和各各種流程程控制語(yǔ)語(yǔ)句,也也可以嵌嵌套其他他的PL/SQL塊。執(zhí)行行部分至至少包含含一條可可執(zhí)行語(yǔ)語(yǔ)句。異常處理理部分:包含在在執(zhí)行部部分中,以關(guān)鍵鍵字EXCEPTION開(kāi)始,到到END結(jié)束。當(dāng)當(dāng)程序檢檢測(cè)到錯(cuò)錯(cuò)誤而產(chǎn)產(chǎn)生異常常時(shí),就就轉(zhuǎn)到由由EXCEPTION標(biāo)識(shí)的部部分執(zhí)行行異常處處理程序序。這部部分是可可選的,利用異異常
5、處理理可以提提高PL/SQL程序的健健壯性。7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)2、PL/SQL的特殊結(jié)結(jié)構(gòu)/*以名字標(biāo)識(shí)PL/SQL塊*/DECLARE聲明部分分BEGIN執(zhí)行部分分EXCEPTION異常處理理部分END;DECLARE主塊聲明明部分BEGIN主塊執(zhí)行行部分DECLARE子塊聲明明部分BEGIN子塊執(zhí)行行部分EXCEPTION子塊異常常處理部部分END;EXCEPTION主塊異常常處理部部分END;帶命名塊塊的PL/SQL塊嵌套結(jié)構(gòu)構(gòu)的PL/SQL塊7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)7.1.3PL/SQL的字符集集1、合法字字符,包包括:大寫(xiě)字母母A-Z和小寫(xiě)字字母a-z數(shù)字0-9符號(hào)()
6、、+、-、*、/、=、!、;、:、.、”、#、$、_、?制表符、空格符符、回車車符等非非顯示的的間空符符號(hào)2、操作符符,包括括:算術(shù)操作作符關(guān)系操作作符邏輯操作作符3、其他字字符7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)7.1.4PL/SQL基本語(yǔ)法法1、常量與與變量的的聲明,語(yǔ)法格格式如下下:CONSTANTNOT NULL(寬度):=【例7.1】幾個(gè)聲明明的例子子 聲明明一個(gè)長(zhǎng)長(zhǎng)度為10B的變量count,初值為為1,類型為為VARCHAR。c varchar2(10):= 1;聲明一個(gè)個(gè)NUMBER數(shù)據(jù)類型型的常量量c_limit,并賦予予初值5000.00。c_limitconstantnumber
7、(8.2):=5000.00;聲明一個(gè)個(gè)NUMBER數(shù)據(jù)類型型的常量量c_area,并用表表達(dá)式給給它賦初初值。c_areaconstantnumber(8.5):=3.14159*3*2;7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)2、作用域變量的作作用域指指變量的的有效使使用范圍圍,它從從變量聲聲明開(kāi)始始,直到到當(dāng)前程程序塊結(jié)結(jié)束,只只有在其其作用域域范圍內(nèi)內(nèi),程序序才能使使用該變變量,否否則將導(dǎo)導(dǎo)致編譯譯錯(cuò)誤。在同一程程序塊中中,不允允許聲明明兩個(gè)同同名變量量,但在在不同程程序塊內(nèi)內(nèi)可以聲聲明兩個(gè)個(gè)同名變變量。在程序塊塊內(nèi)聲明明的變量量稱為局局部變量量,在程程序塊外外聲明的的變量稱稱為全局局變量。引用程
8、序序塊內(nèi)的的局部變變量不需需要加限限定詞,而引用用塊外的的全局變變量需要要加限定定詞(即即父塊的的名稱)。子塊中可可以引用用父塊的的變量,但是父父塊中不不能引用用子塊的的變量。如果父塊塊與子塊塊具有相相同的變變量名,在子塊塊中引用用這個(gè)變變量時(shí)若若是不加加限定詞詞則引用用的是子子塊內(nèi)的的局部變變量。若若兩個(gè)塊塊不是父父子關(guān)系系,則他他們之間間的變量量不能相相互引用用。7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)(3)變量的的屬性變量有名名字和數(shù)數(shù)據(jù)類型型兩個(gè)屬屬性。變變量名用用于標(biāo)識(shí)識(shí)該變量量,變量量的數(shù)據(jù)據(jù)類型確確定了該該變量存存放值的的格式及及允許的的運(yùn)算。在PL/SQL中,使用用“%”表示屬性性提示符符
9、,后面面緊跟屬屬性名。%TYPE和%ROWTYPE是PL/SQL中兩個(gè)特特殊的屬屬性,常常用來(lái)定定義變量量,使被被定義變變量的數(shù)數(shù)據(jù)類型型與一個(gè)個(gè)已定義義變量(或參照照表中的的記錄)的數(shù)據(jù)據(jù)類型相相一致。%TYPE使用%TYPE屬性定義義變量時(shí)時(shí),被定定義變量量的數(shù)據(jù)據(jù)類型與與一個(gè)已已經(jīng)定義義了的變變量的數(shù)數(shù)據(jù)類型型相一致致,當(dāng)被被參照的的變量數(shù)數(shù)據(jù)類型型改變后后,新定定義變量量的數(shù)據(jù)據(jù)類型也也隨之改改變。當(dāng)當(dāng)無(wú)法準(zhǔn)準(zhǔn)確知道道被參照照變量的的數(shù)據(jù)類類型時(shí),只能采采用這種種定義方方法。定定義格式式為:%TYPE7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)【例7.1】聲明三個(gè)個(gè)變量“v_班級(jí)名稱稱”,“v_班級(jí)人
10、數(shù)數(shù)”,“v_班主任”,其數(shù)數(shù)據(jù)類型型分別對(duì)對(duì)應(yīng)“班班級(jí)表”中相應(yīng)應(yīng)字段的的數(shù)據(jù)類類型。根根據(jù)輸入入的班級(jí)級(jí)代碼,輸出對(duì)對(duì)應(yīng)的班班級(jí)名稱稱、人數(shù)數(shù)和班主主任信息息。代碼碼如下:DECLAREv_班級(jí)名稱稱班級(jí)表.班級(jí)名稱稱%TYPE;v_班級(jí)人數(shù)數(shù) 班級(jí)級(jí)表.班級(jí)人數(shù)數(shù)%TYPE;v_班主任班班級(jí)表表.班主任%TYPE;BEGINSELECT班級(jí)名稱稱,班級(jí)人數(shù)數(shù),班主任intov_班級(jí)名稱稱,v_班級(jí)人數(shù)數(shù),v_班主任FROM班級(jí)表WHERE班級(jí)代碼碼=&班級(jí)代碼碼;DBMS_OUTPUT.PUT_LINE(班級(jí)名稱稱:|v_班級(jí)名稱稱);DBMS_OUTPUT.PUT_LINE(班級(jí)人數(shù)數(shù)
11、:|v_班級(jí)人數(shù)數(shù));DBMS_OUTPUT.PUT_LINE(班主任:|v_班主任);END;語(yǔ)句:Setserverouton7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)%ROWTYPE使用%ROWTYPE屬性能夠夠定義記記錄變量量,使得得被定義義的記錄錄成員個(gè)個(gè)數(shù)、名名稱、數(shù)數(shù)據(jù)類型型與已定定義的表表或視圖圖中列的的個(gè)數(shù)、名稱和和數(shù)據(jù)類類型完全全相同。這種定定義方式式,可以以定義一一個(gè)表,當(dāng)被參參照表中中列及數(shù)數(shù)據(jù)類型型改變時(shí)時(shí),新定定義表中中的列及及數(shù)據(jù)類類型自動(dòng)動(dòng)改變。當(dāng)一個(gè)表表有較多多列時(shí),使用%ROWTYPE定義記錄錄,比使使用%TYPE要方便,并且不不容易出出錯(cuò)。定定義格式式為:%ROWTYP
12、E7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)【例7.2】聲明一個(gè)個(gè)變量“v_班級(jí)”,與班級(jí)級(jí)表具有有相同的的數(shù)據(jù)類類型。根根據(jù)輸入入的班級(jí)級(jí)代碼,輸出對(duì)對(duì)應(yīng)的班班級(jí)名稱稱、人數(shù)數(shù)和班主主任信息息。代碼碼如下:DECLAREv_班級(jí)班班級(jí)表%ROWTYPE;BEGINSELECT*intov_班級(jí)FROM班級(jí)表WHERE班級(jí)代碼碼=&班級(jí)代碼碼;DBMS_OUTPUT.PUT_LINE(班級(jí)名稱稱:|v_班級(jí).班級(jí)名稱稱);DBMS_OUTPUT.PUT_LINE(班級(jí)人數(shù)數(shù):|v_班級(jí).班級(jí)人數(shù)數(shù));DBMS_OUTPUT.PUT_LINE(班主任:|v_班級(jí).班主任);END;7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)
13、3、數(shù)據(jù)類型型標(biāo)量類型型LOB型數(shù)據(jù)類型型定義的的運(yùn)算符符7.1PL/SQL語(yǔ)言基礎(chǔ)礎(chǔ)【例7.3】聲聲明一個(gè)個(gè)TIMESTAMP類型的的變量,并為它它賦值。代碼如如下:SETSERVEROUT ONDECLAREcheckoutTIMESTAMP(2);BEGINcheckout:=10-6月月-07 075;DBMS_OUTPUT.PUT_LINE(checkout);END;7.2PL/SQL程序結(jié)構(gòu)構(gòu)7.2.1選擇結(jié)構(gòu)構(gòu)選擇結(jié)構(gòu)構(gòu)又稱條條件控制制,通過(guò)過(guò)先測(cè)試試一個(gè)條條件,根根據(jù)測(cè)試試結(jié)果選選擇運(yùn)行行不同的的語(yǔ)句段段。選擇擇結(jié)構(gòu)允允許嵌套套執(zhí)行。選擇結(jié)構(gòu)構(gòu)常用到到的4種
14、語(yǔ)法格格式:IFTHENENDIF結(jié)構(gòu)IFTHENELSEEND IF結(jié)構(gòu)IFTHENELSIFENDIF結(jié)構(gòu)CASE結(jié)構(gòu)7.2PL/SQL程序結(jié)構(gòu)構(gòu)【例7.4】查查找“ASP.NET程序設(shè)設(shè)計(jì)”課課程,若若是“備備注”信信息為“C#”,將其其改為“J#”,否則則將“備備注”信信息置空空。7.2PL/SQL程序結(jié)構(gòu)構(gòu)DECLAREv_課程程課課程表%ROWTYPE;BEGINSELECT*INTO v_課程FROM課課程表表WHERE課課程名=ASP.NET程序序設(shè)計(jì);IFv_課程程.備注注=C#THENUPDATE課課程表表SET備備注=J#WHERE課課程名=v_課課程.課課程名;ELSE
15、UPDATE課課程表表SET備備注=WHERE課課程名=v_課課程.課課程名;ENDIF;DBMS_OUTPUT.PUT_LINE(更新完完成!);END;試一試:數(shù)據(jù)被被修改了了嗎?為為什么?作業(yè)一、用你你熟悉的的方法完完成該該問(wèn)題,比較較兩種方方法。7.2PL/SQL程序結(jié)構(gòu)構(gòu)【例7.5】學(xué)生成績(jī)績(jī)按照分分?jǐn)?shù)段分分為“優(yōu)優(yōu)秀”、“良好好”、“合格”、“不不及格”4種等級(jí),根據(jù)等等級(jí)的不不同,可可以輸出出對(duì)應(yīng)的的分?jǐn)?shù)段段,代碼碼如下:DECLAREv_resultVARCHAR2(20):=良好;BEGINIFv_result=優(yōu)秀 THENDBMS_OUTPUT.PUT_LINE(9010
16、0);ELSIFv_result=良好 THENDBMS_OUTPUT.PUT_LINE(8089);ELSIFv_result=合格 THENDBMS_OUTPUT.PUT_LINE(6079);ELSIFv_result=不及格 THENDBMS_OUTPUT.PUT_LINE(=90andv_score=80andv_score=60andv_score=0 andv_score 60)THENDBMS_OUTPUT.PUT_LINE(成績(jī):|v_score|不及格);ELSEDBMS_OUTPUT.PUT_LINE(成績(jī):|v_score|成績(jī)異常常);ENDCASE;END;7.2P
17、L/SQL程序結(jié)構(gòu)構(gòu)【例7.7】使用CASE語(yǔ)句完成成例7.5程序。要要求使用用CASE語(yǔ)句第二二種語(yǔ)法法格式實(shí)實(shí)現(xiàn),代代碼如下下:DECLAREv_resultVARCHAR2(20):=良好;BEGINCASE v_resultWHEN 優(yōu)秀 THENDBMS_OUTPUT.PUT_LINE(90100);WHEN 良好 THENDBMS_OUTPUT.PUT_LINE(8089);WHEN 合格 THENDBMS_OUTPUT.PUT_LINE(6079);WHEN 不及格 THENDBMS_OUTPUT.PUT_LINE(100;v_s:=v_s+v_i;v_i:=v_i+1;ENDL
18、OOP;DBMS_OUTPUT.PUT_LINE(1100自然數(shù)之之和:|v_s);END;7.2PL/SQL程序結(jié)構(gòu)構(gòu)【例7.9】利用WHILE循環(huán)計(jì)算算1至100的自然數(shù)數(shù)之和。代碼如如下:DECLAREv_iNUMBER:=0;v_sNUMBER:=0;BEGINWHILEv_i=100LOOPv_s:=v_s+v_i;v_i:=v_i+1;ENDLOOP;DBMS_OUTPUT.PUT_LINE(1100自然數(shù)之之和:|v_s);END;7.2PL/SQL程序結(jié)構(gòu)構(gòu)【例7.10】利用FOR循循環(huán)語(yǔ)句句計(jì)算1至100的自自然數(shù)之之和。代代碼如下下:DECLAREv_sNUMBER:=0;
19、BEGINFORv_i IN 1.100LOOPv_s:=v_s+v_i;ENDLOOP;DBMS_OUTPUT.PUT_LINE(1100自自然數(shù)之之和:|v_s);END;思考題:如何利利用循環(huán)環(huán)語(yǔ)句生生成數(shù)據(jù)據(jù)?7.2PL/SQL程序結(jié)構(gòu)構(gòu)7.2.3順序結(jié)構(gòu)構(gòu)順序結(jié)構(gòu)構(gòu)是一種種最簡(jiǎn)單單的控制制結(jié)構(gòu),程序按按語(yǔ)句順順序依次次執(zhí)行。有時(shí)為為了打破破執(zhí)行順順序,將將當(dāng)前程程序跳轉(zhuǎn)轉(zhuǎn)到另一一個(gè)地方方繼續(xù)運(yùn)運(yùn)行,需需要借助助GOTO語(yǔ)句。GOTO語(yǔ)句是一一種無(wú)條條件跳轉(zhuǎn)轉(zhuǎn)語(yǔ)句,能夠?qū)⒄Z(yǔ)句無(wú)無(wú)條件地地跳轉(zhuǎn)到到一個(gè)用用標(biāo)簽指指定的語(yǔ)語(yǔ)句,其其目的地地必須與與GOTO語(yǔ)句在同同一程序序塊中或或更高層層次(比比如父塊塊中)中中。但過(guò)過(guò)多的使使用GOTO語(yǔ)句會(huì)導(dǎo)導(dǎo)致程序序復(fù)雜,破壞程程序的結(jié)結(jié)構(gòu)。因因此,GOTO語(yǔ)句一般般只用在在從一個(gè)個(gè)PL/SQL塊中跳轉(zhuǎn)轉(zhuǎn)到異常常處理語(yǔ)語(yǔ)句的前前面7.2PL/SQL程序結(jié)構(gòu)構(gòu)【例7.11】利用GOTO語(yǔ)句計(jì)算算1至100的自然數(shù)數(shù)之和。代碼如如下:DECLAREv_iNUMBER:=0;v_sNUMBER:=0;BEGINv_i:=v_i+1;IFv_i=100THENv_s:=v_s
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 承攬房屋裝修工程合同
- 房地產(chǎn)轉(zhuǎn)讓合同集錦
- 兼職勞務(wù)合同
- 人力資源服務(wù)合同
- 德漢翻譯服務(wù)合同
- 節(jié)能設(shè)備購(gòu)銷合同協(xié)議
- 禽蛋類采購(gòu)合同
- 物業(yè)管理市場(chǎng)分析與競(jìng)爭(zhēng)策略
- 爆破工程技術(shù)服務(wù)合同
- 軟件銷售代理合作合同
- 全國(guó)大學(xué)生英語(yǔ)競(jìng)賽詞匯大綱
- 情緒障礙跨診斷治療的統(tǒng)一方案
- 聚焦幼兒作品分析的游戲觀察與評(píng)價(jià)
- 胸外科手術(shù)圍手術(shù)期處理
- 《企業(yè)管理課件:團(tuán)隊(duì)管理知識(shí)點(diǎn)詳解PPT》
- 配網(wǎng)設(shè)備缺陷分類及管理重點(diǎn)標(biāo)準(zhǔn)
- 反腐倡廉廉潔行醫(yī)
- UI與交互設(shè)計(jì)人機(jī)交互設(shè)計(jì)(第二版)PPT完整全套教學(xué)課件
- 《插畫(huà)設(shè)計(jì)》課程標(biāo)準(zhǔn)
- 高考作文答題卡(作文)
- 在鄉(xiāng)村治理中深化推廣運(yùn)用清單制、積分制、一張圖工作方案
評(píng)論
0/150
提交評(píng)論