![PLSQL是ORACLE對標準數據庫語言的擴展_第1頁](http://file4.renrendoc.com/view/b96406970e20ea8110571a8a53d33b76/b96406970e20ea8110571a8a53d33b761.gif)
![PLSQL是ORACLE對標準數據庫語言的擴展_第2頁](http://file4.renrendoc.com/view/b96406970e20ea8110571a8a53d33b76/b96406970e20ea8110571a8a53d33b762.gif)
![PLSQL是ORACLE對標準數據庫語言的擴展_第3頁](http://file4.renrendoc.com/view/b96406970e20ea8110571a8a53d33b76/b96406970e20ea8110571a8a53d33b763.gif)
![PLSQL是ORACLE對標準數據庫語言的擴展_第4頁](http://file4.renrendoc.com/view/b96406970e20ea8110571a8a53d33b76/b96406970e20ea8110571a8a53d33b764.gif)
![PLSQL是ORACLE對標準數據庫語言的擴展_第5頁](http://file4.renrendoc.com/view/b96406970e20ea8110571a8a53d33b76/b96406970e20ea8110571a8a53d33b765.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、PL/SQL是ORACLE對標準數據庫語言的擴展,ORACLE公司已經將PL/SQL整合到ORACLE 服務器和其他工具中了,近幾年中更多的開發(fā)人員和DBA開始使用PL/SQL,本文將講述PL/SQL基礎語法,結構和組件、以及如何設計并執(zhí)行一個PL/SQL程序。PL/SQL的優(yōu)點從版本6開始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的優(yōu)點以及其獨有的數據管理的便利性,那么你很難想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一個獨立的產品,他是一個整合到ORACLE服務器和ORACLE工具中的技術,可以把PL/SQL看作ORACLE服務器內的一個引擎,sql語
2、句執(zhí)行者處理單個的sql語句,PL/SQL引擎處理PL/SQL程序塊。當PL/SQL程序塊在PL/SQL引擎處理時,ORACLE服務器中的SQL語句執(zhí)行器處理pl/sql程序塊中的SQL語句。PL/SQL的優(yōu)點如下:. PL/SQL是一種高性能的基于事務處理的語言,能運行在任何ORACLE環(huán)境中,支持所有數據處理命令。通過使用PL/SQL程序單元處理SQL的數據定義和數據控制元素。. PL/SQL支持所有SQL數據類型和所有SQL函數,同時支持所有ORACLE對象類型. PL/SQL塊可以被命名和存儲在ORACLE服務器中,同時也能被其他的PL/SQL程序或SQL命令調用,任何客戶/服務器工具
3、都能訪問PL/SQL程序,具有很好的可重用性。. 可以使用ORACLE數據工具管理存儲在服務器中的PL/SQL程序的安全性??梢允跈嗷虺蜂N數據庫其他用戶訪問PL/SQL程序的能力。. PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何ORACLE能夠運行的操作系統(tǒng)都是非常便利的. 對于SQL,ORACLE必須在同一時間處理每一條SQL語句,在網絡環(huán)境下這就意味作每一個獨立的調用都必須被oracle服務器處理,這就占用大量的服務器時間,同時導致網絡擁擠。而PL/SQL是以整個語句塊發(fā)給服務器,這就降低了網絡擁擠。PL/SQL塊結構PL/SQL是一種塊結構的語言,組成PL/SQL程序
4、的單元是邏輯塊,一個PL/SQL 程序包含了一個或多個邏輯塊,每個塊都可以劃分為三個部分。與其他語言相同,變量在使用之前必須聲明,PL/SQL提供了獨立的專門用于處理異常的部分,下面描述了PL/SQL塊的不同部分:聲明部分(Declaration section)聲明部分包含了變量和常量的數據類型和初始值。這個部分是由關鍵字DECLARE開始,如果不需要聲明變量或常量,那么可以忽略這一部分;需要說明的是游標的聲明也在這一部分。執(zhí)行部分(Executable section)執(zhí)行部分是PL/SQL塊中的指令部分,由關鍵字BEGIN開始,所有的可執(zhí)行語句都放在這一部分,其他的PL/SQL塊也可以放
5、在這一部分。異常處理部分(Exception section)這一部分是可選的,在這一部分中處理異常或錯誤,對異常處理的詳細討論我們在后面進行。PL/SQL塊語法DECLARRE-declaaratioon staatemenntsBEGGIN-execuutablee stattementtsEXCCEPTIOON-excepption stateementssENDPL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以使多行的,但分號表示該語句的結束。一行中可以有多條SQL語句,他們之間以分號分隔。每一個PL/SQL塊由BEGIN或DECLARE開始,以END結束。注釋由-標示。PL
6、/SQL塊的命名和匿名PL/SQL程序塊可以是一個命名的程序塊也可以是一個匿名程序塊。匿名程序塊可以用在服務器端也可以用在客戶端。命名程序塊可以出現在其他PL/SQL程序塊的聲明部分,這方面比較明顯的是子程序,子程序可以在執(zhí)行部分引用,也可以在異常處理部分引用。PL/SQL程序塊可背獨立編譯并存儲在數據庫中,任何與數據庫相連接的應用程序都可以訪問這些存儲的PL/SQL程序塊。ORACLE提供了四種類型的可存儲的程序:. 函數. 過程. 包. 觸發(fā)器函數函數是命名了的、存儲在數據庫中的PL/SQL程序塊。函數接受零個或多個輸入參數,有一個返回值,返回值的數據類型在創(chuàng)建函數時定義。定義函數的語法如
7、下:FUNCTIOON namme pparameeter,parammeter,.) RETTURN ddatatyypes IISloccal deeclaraationssBEGIINexeccute sstatemmentsEXCEPPTIONeexcepttion hhandleersENND naame過程存儲過程是一個PL/SQL程序塊,接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數不同,存儲過程沒有返回值,存儲過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內部調用,定義存儲過程的語法如下:PR
8、OCEDUURE naame (parammeter,paraameterr,.) ISSlocaal decclarattionsBEGINNexecutte staatemenntsEXXCEPTIIONexcceptioon hanndlerss ENDD namme包(pacckage)包其實實就是被組合合在一起的相相關對象的集集合,當包中中任何函數或或存儲過程被被調用,包就就被加載入內內存中,包中中的任何函數數或存儲過程程的子程序訪訪問速度將大大大加快。包包由兩個部分分組成:規(guī)范范和包主體(body),規(guī)范描述述變量、常量量、游標、和和子程序,包包體完全定義義子程序和游游標。觸發(fā)器(
9、triggger)觸發(fā)器與一一個表或數據據庫事件聯系系在一起的,當當一個觸發(fā)器器事件發(fā)生時時,定義在表表上的觸發(fā)器器被觸發(fā)。變變量和常量變量存放放在內存中以以獲得值,能能被PL/SSQL塊引用用。你可以把把變量想象成成一個可儲藏藏東西的容器器,容器內的的東西是可以以改變的。聲明變量量變量一一般都在PLL/SQL塊塊的聲明部分分聲明,PLL/SQL是是一種強壯的的類型語言,這這就是說在引引用變量前必必須首先聲明明,要在執(zhí)行行或異常處理理部分使用變變量,那么變變量必須首先先在聲明部分分進行聲明。聲明變量的語法如下:Variablle_namme COONSTANNT daatabytte NOOT
10、 NULLL:=|DEFAAULT eexpresssion注意:可以以在聲明變量量的同時給變變量強制性的的加上NOTT NULLL約束條件,此此時變量在初初始化時必須須賦值。給變量賦值值給變量量賦值有兩種種方式:. 直接給給變量賦值X:=200;Y=YY+(X*220);. 通過SSQL SEELECT INTO 或FETCCH INTTO給變量賦賦值SELEECT SUUM(SALLARY),SUM(SSALARYY*0.1)INTO TOTALL_SALAARY,TAATAL_CCOMMISSSIONFFROM EEMPLOYYEEWHEERE DEEPT=100;常量常量量與變量相似似
11、,但常量的的值在程序內內部不能改變變,常量的值值在定義時賦賦予,他的的聲明方式與與變量相似,但但必須包括關關鍵字CONNSTANTT。常量和變變量都可被定定義為SQLL和用戶定義義的數據類型型。ZERO_VAALUE CCONSTAANT NUUMBER:=0;這個語句定定了一個名叫叫ZERO_VALUEE、數據類型型是NUMBBER、值為為0的常量。標量(scalar)數據類型標量(scalar)數據類型沒有內部組件,他們大致可分為以下四類:. number. character. date/time. boolean表1顯示了數字數據類型;表2顯示了字符數據類型;表3顯示了日期和布爾數據類
12、型。表1 Scalar Types:NumericDatatyppeRangeSubtypeesdescripptionBINARY_INTEGGER-2147488-214774836447NATURALLNATURRALNPOOSITIVVEPOSIITIVENNSIGNTTYPE 用于存儲單字節(jié)節(jié)整數。要求求存儲長度低低于NUMBBER值。用用于限制范圍圍的子類型(SUBTYYPE):NATURRAL:用于于非負數PPOSITIIVE:只用用于正數NNATURAALN:只用用于非負數和和非NULLL值POSSITIVEEN:只用于于正數,不能能用于NULLL值SIIGNTYPPE:只有值
13、值:-1、00或1.NUMBER1.0E-1330-9.999E1255DECDECIIMALDOOUBLE PRECIISIONFFLOAT INTEGGERICIINTNUMMERICRREALSMMALLINNT存儲數字值,包包括整數和浮浮點數。可以以選擇精度和和刻度方式,語語法:numberr(,)。缺省省的精度是338,scaale是0.PLS_INTTEGER-21474883647-214744836477與BINARYY_INTEEGER基本本相同,但采采用機器運算算時,PLSS_INTEEGER提供供更好的性能能 。表2 字符符數據類型 datatypperangsubtyp
14、eedescripptionCHAR最大長度327767字節(jié) CHARACTTER存儲定長字符串串,如果長度度沒有確定,缺缺省是1LONG最大長度214474836647字節(jié)存儲可變長度字字符串RAW 最大長度327767字節(jié)用于存儲二進制制數據和字節(jié)節(jié)字符串,當當在兩個數據據庫之間進行行傳遞時,RRAW數據不不在字符集之之間進行轉換換。LONGRAWW最大長度214474836647與LONG數據據類型相似,同同樣他也不能能在字符集之之間進行轉換換。ROWID18個字節(jié)與數據庫ROWWID偽列類類型相同,能能夠存儲一個個行標示符,可可以將行標示示符看作數據據庫中每一行行的唯一鍵值值。VARC
15、HARR2最大長度327767字節(jié)STRINGVVARCHAAR與VARCHAAR數據類型型相似,存儲儲可變長度的的字符串。聲聲明方法與VVARCHAAR相同 表3 DAATE和BOOOLEANNdatatypperange descripptionBOOLEANNTRUE/FAALSE存儲邏輯值TRRUE或FAALSE,無無參數DATE01/01/44712 BBC 存儲固定長的日日期和時間值值,日期值中中包含時間LOB數據據類型LLOB(大對對象,Larrge obbject) 數據類型型用于存儲類類似圖像,聲聲音這樣的大大型數據對象象,LOB數數據對象可以以是二進制數數據也可以是是字符數
16、據,其其最大長度不不超過4G。LOBB數據類型支支持任意訪問問方式,LOONG只支持持順序訪問方方式。LOBB存儲在一個個單獨的位置置上,同時一一個LOBB定位符(LOB llocatoor)存儲在在原始的表中中,該定位符符是一個指向向實際數據的的指針。在PPL/SQLL中操作LOOB數據對象象使用ORAACLE提供供的包DBMMS_LOBB.LOB數數據類型可分分為以下四類類:. BFILEE. BBLOB. CLOOB. NCLOBB操作符符與其他他程序設計語語言相同,PPL/SQLL有一系列操操作符。操作作符分為下面面幾類:. 算術操操作符. 關系操作作符. 比較操作符符. 邏輯輯操作符
17、算術操作符符如表4所示示operatooroperatiion+ 加- 減/ 除* 乘*乘方關系操作符符主要用于條條件判斷語句句或用于whhere子串串中,關系操操作符檢查條條件和結果是是否為truue或fallse,表55是PL/SSQL中的關關系操作符operatooroperatiion 小于操作符 大于操作符=大于或等于操作作符= 等于操作符 != 不等于操作符 不等于操作符:= 賦值操作符表6 顯示示的是比較操操作符operatoor operatiionIS NULLL如果操作數為NNULL返回回TRUELIKE比較字符串值BETWEENN驗證值是否在范范圍之內IN驗證操作數在設設
18、定的一系列列值中表7.8顯顯示的是邏輯輯操作符operatooroperatiionAND 兩個條件都必須須滿足OR只要滿足兩個條條件中的一個個NOT取反執(zhí)行部分執(zhí)行部分分包含了所有有的語句和表表達式,執(zhí)行行部分以關鍵鍵字BEGIIN開始,以以關鍵字EXXCEPTIION結束,如如果EXCEEPTIONN不存在,那那么將以關鍵鍵字END結結束。分號分分隔每一條語語句,使用賦賦值操作符:=或SELLECT IINTO或FFETCH INTO給給每個變量賦賦值,執(zhí)行部部分的錯誤將將在異常處理理部分解決,在在執(zhí)行部分中中可以使用另另一個PL/SQL程序序塊,這種程程序塊被稱為為嵌套塊所有的SQQL數
19、據操作作語句都可以以用于執(zhí)行部部分,PL/SQL塊不不能再屏幕上上顯示SELLECT語句句的輸出。SSELECTT語句必須包包括一個INNTO子串或或者是游標的的一部分,執(zhí)執(zhí)行部分使用用的變量和常常量必須首先先在聲明部分分聲明,執(zhí)行行部分必須至至少包括一條條可執(zhí)行語句句,NULLL是一條合法法的可執(zhí)行語語句,事物控控制語句COOMMIT和和ROLLBBACK可以以在執(zhí)行部分分使用,數據據定義語言(Data Definnitionn langguage)不能在執(zhí)行行部分中使用用,DDL語語句與EXEECUTE IMMEDDIATE一一起使用或者者是DBMSS_SQL調調用。執(zhí)行一個個PL/SQQ
20、L塊SSQL*PLLUS中匿名名的PL/SSQL塊的執(zhí)執(zhí)行是在PLL/SQL塊塊后輸入/來來執(zhí)行,如下下面的例子所所示:declaree v_ccomm_ppercennt connstantt numbber:=110;begginuppdate empsset coomm=saal*v_ccomm_ppercenntwheere deeptno=10;eendSQLL /PLL/SQL proceedure succeessfullly coompletted.SQQL命名的程序序與匿名程序序的執(zhí)行不同同,執(zhí)行命名名的程序塊必必須使用exxecutee關鍵字:create or reepl
21、acee procceduree updaate_coommisssion(v_deppt in numbeer,v_ppervennt in numbeer deffault 10) iis begginuppdate empsset coomm=saal*v_ppercenntwheere deeptno=v_deppt;enddSQL/Proceedure creattedSQLLexeccute uupdatee_commmissioon(10,15);PPL/SQLL procceduree succcessfuully ccompleeted.SSQL 如果在另一一個命名程序序塊或
22、匿名程程序塊中執(zhí)行行這個程序,那那么就不需要要EXECUUTE關進字字。declareev_deept nuumber;beginseelect a.depptnoiinto vv_depttfromm emp awheere joob=PRRESIDEENTuupdatee_commmissioon(v_ddept);endSQLL/PLL/SQL proceedure succeessfullly coomplettedSQLL控制結構控控制結構控制制PL/SQQL程序流程程的代碼行,PL/SQQL支持條件件控制和循環(huán)環(huán)控制結構。語法和用途IF.THEN語法:IF condditionn
23、THENNStattementts 1;Stateementss 2;.ENND IF IF語句判判斷條件coonditiion是否為為TRUE,如如果是,則執(zhí)執(zhí)行THENN后面的語句句,如果coonditiion為faalse或NNULL則跳跳過THENN到END IF之間的的語句,執(zhí)行行END IIF后面的語語句。IF.THEN.ELSSE語法法:IF condditionn THENNStattementts 1;Stateementss 2;.ELLSESttatemeents 11;Staatemennts 2;.END IIF 如果條件ccondittion為TTRUE,則則執(zhí)行T
24、HEEN到ELSSE之間的語語句,否則執(zhí)執(zhí)行ELSEE到END IF之間的的語句。IF 可以以嵌套,可以以在IF 或或IF .ELSE語語句中使用IIF或IF.ELSEE語句。if (abb) andd (acc) theeng:=a;ellsegg:=b;if ccg thheng:=c;endd ifennd ifIF.TTHEN.ELSIFF語法:IF condditionn1 THEENstateement11;ELSIIF connditioon2 THHENsttatemeent2;EELSIF condiition33 THENNstattementt3;ELSSEstaatem
25、ennt4;ENND IF;stattementt5;如果條件ccondittion1為為TRUE則則執(zhí)行staatemennt1,然后后執(zhí)行staatemennt5,否則則判斷connditioon2是否為為TRUE,若為TRUUE則執(zhí)行sstatemment2,然后執(zhí)行sstatemment5,對于connditioon3也是相相同的,如果果condiition11,condditionn2,connditioon3都不成成立,那么將將執(zhí)行staatemennt4,然后后執(zhí)行staatemennt5。循環(huán)控制循環(huán)控制的的基本形式是是LOOP語語句,LOOOP和ENDD LOOPP之間的語句
26、句將無限次的的執(zhí)行。LOOOP語句的的語法如下:LOOOP stateementss;ENND LOOOPLOOOP和ENND LOOOP之間的語語句無限次的的執(zhí)行顯然是是不行的,那那么在使用LLOOP語句句時必須使用用EXIT語語句,強制循循環(huán)結束,例例如:X:=100;LOOPXX:=X+110;IFF X10000 THHENEEXIT;END IIFEND LOOP;Y:=X;此時Y的值值是10100.EXXIT WHHEN語句將將結束循環(huán),如如果條件為TTRUE,則則結束循環(huán)。X:=100;LOOPX:=X+100;EXITT WHENN X10000;X:=X+100;END LO
27、OP;Y:=X;WHILEE.LOOOPWHHILE.LOOP有有一個條件與與循環(huán)相聯系系,如果條件件為TRUEE,則執(zhí)行循循環(huán)體內的語語句,如果結結果為FALLSE,則結結束循環(huán)。X:=100;WHILE X=10000 LOOOPX:=X+100;END LOOP;Y=X; FOR.LOOPP語法:FOR couunter IN RREVERSSE sttart_rrange.ennd_rannge LOOOPstaatemennts;ENND LOOOP;LOOP和和WHILEE循環(huán)的循環(huán)環(huán)次數都是不不確定的,FFOR循環(huán)的的循環(huán)次數是是固定的,ccounteer是一個隱隱式聲明的變變量
28、,他的初初始值是sttart_rrange,第二個值是是startt_rangge+1,直直到end_rangee,如果sttart_rrange等等于end _rangge,那么循循環(huán)將執(zhí)行一一次。如果使使用了REVVERSE關關鍵字,那么么范圍將是一一個降序。X:=100;FOR vv_counnter iin 1.10 looopx:=x+10;end lloopy:=x;如果要退出出for循環(huán)環(huán)可以使用EEXIT語句句。標簽用戶戶可以使用標標簽使程序獲獲得更好的可可讀性。程序序塊或循環(huán)都都可以被標記記。標簽的形形式是。標記程序塊DECLLARE. . .BEGINN.EEXCEPTTI
29、ON.END llabel_name標記循環(huán)LOOP.loop.loop.EXIIT outter_looop WHHEN v_condiition=0;endd loopp inneermostt_loopp;.END LOOP innerr_loopp;END LOOP outerr_loopp; GOTO語語句語法法:GOOTO LAABEL;執(zhí)行GOOTO語句時時,控制會立立即轉到由標標簽標記的語語句。PL/SQL中對對GOTO語語句有一些限限制,對于塊塊、循環(huán)、IIF語句而言言,從外層跳跳轉到內層是是非法的。X :=1000;FOR V_COUUNTER IN 1.10 LLOOPI
30、IF V_CCOUNTEER =4 THENGOTOO end_of_looopENND IFX:=X+10;NULLLEND LOOPYY:=X; 注意:NUULL是一個個合法的可執(zhí)執(zhí)行語句。嵌套程序序塊的內部可可以有另一個個程序塊這種種情況稱為嵌嵌套。嵌套要要注意的是變變量,定義在在最外部程序序塊中的變量量可以在所有有子塊中使用用,如果在子子塊中定義了了與外部程序序塊變量相同同的變量名,在在執(zhí)行子塊時時將使用子塊塊中定義的變變量。子塊中中定義的變量量不能被父塊塊引用。同樣樣GOTO語語句不能由父父塊跳轉道子子塊中,反之之則是合法的的。OUTER BLOCKKDECLLAREAA_NUMBB
31、ER INNTEGERR;B_NNUMBERR INTEEGER;BBEGIN-A_NNUMBERR and B_NUMMBER aare avvailabble heereDECLLARECC_NUMBBER INNTEGERRB_NUUMBER NUMBEER(20)BEGINNC_NUUMBER:=A_NUUMBER;C_NUUMBER=OUTERR_BLOCCK.B_NNUMBERR;END SUB_BBLOCK;END OOUT_BLLOCK;小結 我我們在這篇文文章中介紹了了PL/SQQL的基礎語語法以及如何何使用PL/SQL語言言設計和運行行PL/SQQL程序塊,并并將PL/SS
32、QL程序整整合到Oraacle服務務器中,雖然然PL/SQQL程序作為為功能塊嵌入入Oraclle數據庫中中,但PL/SQL與OORACLEE數據庫的緊緊密結合使得得越來越多的的Oraclle數據庫管管理員和開發(fā)發(fā)人員開始使使用PL/SSQL。全面探討PL/SQL的復復合數據類型型PL/SQL有有兩種復合數數據結構:記記錄和集合。記記錄由不同的的域組成,集集合由不同的的元素組成。在在本文中我們們將討論記錄錄和集合的類類型、怎樣定定義和使用記記錄和集合。PL/SQL 記錄記錄是PL/SQL的一種復合數據結構,scalar數據類型和其他數據類型只是簡單的在包一級進行預定義,但復合數據類型在使用前必
33、須被定義,記錄之所以被稱為復合數據類型是因為他由域這種由數據元素的邏輯組所組成。域可以是scalar數據類型或其他記錄類型,它與c語言中的結構相似,記錄也可以看成表中的數據行,域則相當于表中的列,在表和虛擬表(視圖或查詢)中非常容易定義和使用,行或記錄中的每一列或域都可以被引用或單獨賦值,也可以通過一個單獨的語句引用記錄所有的域。在存儲過程或函數中記錄也可能有參數。創(chuàng)建記錄在PL/SQL中有兩種定義方式:顯式定義和隱式定義。一旦記錄被定義后,聲明或創(chuàng)建定義類型的記錄變量,然后才是使用該變量。隱式聲明是在基于表的結構或查詢上使用%TYPE屬性,隱式聲明是一個更強有力的工具,這是因為這種數據變量是
34、動態(tài)創(chuàng)建的。顯式定義記錄顯式定義記錄是在PL/SQL程序塊中創(chuàng)建記錄變量之前在聲明部分定義。使用type命令定義記錄,然后在創(chuàng)建該記錄的變量。語法如下: TYPE reecord_type IS REECORD (fielld_deffinitiion_liist);fieldd_defiinitioon_lisst是由逗號號分隔的列表表。域定定義的語法如如下:field_nname ddata_ttype_aand_siize NNOT NUULL:=|DEEFAULTT deffault_valuee域名必須服服從與表或列列的命名規(guī)則則相同的命名名規(guī)則。下面面我們看一個個例子:DELCAR
35、EETYPE stockk_quotte_recc IS RRECORDD(symbbol sttock.ssymboll%TYPEE,bid NUMBEER(10,4),assk NUMMBER(110,4),volumme NUMMBER NNOT NUULL:=00,exchhange VARCHHAR2(66) DEFFAULT NASDDAQ);real_time_quotee stocck_quoote_reec;varriablee域定義時的的%TYPEE屬性用于引引用數據庫中中的表或視圖圖的數據類型型和大小,而而在此之前程程序不知道類類型和大小。在在上面的例子子中記錄域在在編譯
36、時將被被定義為與列列SYMBOOL相同的數數據類型和大大小,當代碼碼中要使用來來自數據庫中中的數據時,在在變量或域定定義中最好使使用%TYPPE來定義。隱式定義記錄隱式定義記錄中,我們不用描述記錄的每一個域。這是因為我們不需要定義記錄的結構,不需要使用TYPE語句,相反在聲明記錄變量時使用%ROWTYPE命令定義與數據庫表,視圖,游標有相同結構的記錄,與TYPE命令相同的是它是一種定義獲得數據庫數據記錄的好方法。DECLAREEaccouunter_info accouunts%RROWTYPPR;CURRSOR xxactioons_cuur(accct_no IN VAARCHARR2)
37、ISSSELECCT acttion,ttimesttamp,hholdinngFROMM porttfolioosWHERRE acccount_nbr=acct_no;xactiion_innfo xaactionns_curr%ROWTTYPE;vvariabble有一些PLL/SQL指指令在使用隱隱式定義記錄錄時沒有使用用%ROWTTYPE屬性性,比如游標標FOR循環(huán)環(huán)或觸發(fā)器中中的:oldd和:neww記錄。DELCAREECURSOOR xacction_cur IISSELEECT acction,timeaamp,hooldinggFROM portffoliossWHEREE
38、 accoount_nnbr=337;BEGINNFOR xxactioon_recc in xxactioons_cuurLOOPPIF xaactionns_recc.holdding=ORCLTHENnootify_shareeholdeer;ENDD IF;EEND LOOOP;使用記錄用用戶可以給記記錄賦值、將將值傳遞給其其他程序。記記錄作為一種種復合數據結結構意味作他他有兩個層次次可用。用戶戶可以引用整整個記錄,使使用seleect innto或feetch轉移移所有域,也也可以將整個個記錄傳遞給給一個程序或或將所有域的的值賦給另一一個記錄。在在更低的層次次,用戶可以以處理記錄內內
39、單獨的域,用用戶可以給單單獨的域賦值值或者在單獨獨的域上運行行布爾表達式式,也可以將將一個或更多多的域傳遞給給另一個程序序。引用記錄錄記錄由由域組成,訪訪問記錄中的的域使用點(.)符號。我我們使用上面面的例子看看看DELCAREETYPE stockk_quotte_recc IS RRECORDD(symbbol sttock.ssymboll%TYPEE,bid NUMBEER(10,4),assk NUMMBER(110,4),volumme NUMMBER NNOT NUULL:=00,exchhange VARCHHAR2(66) DEFFAULT NASDDAQ);TYPE det
40、aiiled_qquote_rec IIS RECCORD(qquote stockk_quotte_recc,timeestampp datee,bid_size NUMBEER,askk.sizee NUMBBER,laast_tiick VAARCHARR2(4);reall_timee_detaail deetail_quotee_rec;BEGINNreal_time_detaiil.bidd_sizee:=10000;reaal_timme_dettail.qquote.volumme:=1556700;log_qquote(real_time_detaiil.quoote);給記
41、錄賦值值給記錄錄或記錄中的的域賦值的方方法有幾種,可可以使用SEELECT INTO或或FETCHH給整個記錄錄或單獨的域域賦值, 可可以將整個記記錄的值賦給給其他記錄,也也可以通過給給每個域賦值值來得到記錄錄,以下我們們通過實例講講解每一種賦賦值方法。1、使用用SELECCT INTTO使用用SELECCT INTTO給記錄賦賦值要將記錄錄或域放在IINTO子串串中,INTTO子串中的的變量與SEELECT中中列的位置相相對應。例:DECLAREEstockk_infoo1 stoocks%RROWTYPPE;stoock_innfo2 sstockss%ROWTTYPE;BBEGINSSE
42、LECTT symbbol,exxchanggeINTOO stocck_inffo1.syymbol,stockk_infoo1.excchangeeFROM stockksWHERRE symmbol=ORCL;SELEECT * INTO stockk_infoo2 FROOM stoocksWHHERE ssymboll=ORCCL;2、使用FFETCH如果SQQL語句返回回多行數據或或者希望使用用帶參數的游游標,那么就就要使用游標標,這種情況況下使用FEETCH語句句代替INSSTEAD INTO是是一個更簡單單、更有效率率的方法,但但在安全性較較高的包中FFETCH的的語法如下:F
43、ETCH ccursorr_namee INTOO variiable;我們改寫上上面的例子:DECLAREECURSOOR stoock_cuur(symmbol_iin VARRCHAR22) IS SELECCT symmbol,eexchannge,beegin_ddateFRROM sttockWHHERE ssymboll=UPPEER(symmbol_iin);sttock_iinfo sstock_cur%RROWTYPPEBEGIINOPEN sstock_cur(ORCL);FETTCH sttock_ccur INNTO sttock_iinfo;使用賦值語語句將整個記記
44、錄復制給另另一個記錄是是一項非常有有用的技術,不不過記錄必須須精確地被聲聲明為相同的的類型,不能能是基于兩個個不同的TYYPE語句來來獲得相同的的結構。例:DECLAREETYPE stockk_quotte_recc IS RRECORDD(symbbol sttocks.symbool%TYPPE,bidd NUMBBER(100,4),aask nuumber(10,4),voluume NUUMBER);TYPEE stocck_quoote_tooo IS RECORRD(symmbol sstockss.symbbol%TYYPE,biid NUMMBER(110,4),ask n
45、numberr(10,44),vollume NNUMBERR);-這兩兩個記錄看上上去是一樣的的,但實際上上是不一樣的的stockk_one stockks_quoote_reec;stoock_twwo stoocks_qquote_rec; -這兩個個域有相同的的數據類型和和大小stoock_allso sttock_rrec_tooo;-與與stockk_quotte_recc是不同的數數據類型 BBEGINsstock_one.ssymboll:=orrcl;sstock_one.vvolumee:=12334500;stockk_two:=stocck_onee;-正確確syock
46、k_alsoo:=stoock_onne;-錯錯誤,數據類類型錯誤sttock_aalso.ssymboll:=stoock_onne.symmbol;sstock_also.volumme:=sttock_oone.voolume; 記錄不能用用于INSEERT語句和和將記錄直接接用于比較,下下面兩種情況況是錯誤的:INSSERT IINTO sstockss VALUUES (sstock_recorrd);和IIF stoock_reec1sttock_rrec2 TTHEN要特別注意意考試中試題題中有可能用用%ROWTTYPE來欺欺騙你,但這這是錯誤的,記記住這一點。還還有可能會出出現
47、用記錄排排序的情況,OORACLEE不支持記錄錄之間的直接接比較。對于于記錄比較,可可以采用下面面的兩個選擇擇:. 設計一個函函數,該函數數返回scaalar數據據類型,使用用這個函數比比較記錄,如如IF sortt_rec(stockk_one)sortt_rec(stockk_two) THENN. 可以使使用數據庫對對象,數據庫庫對象可以使使用ordeer或mapp方法定義,允允許oraccle對復合合數據類型進進行比較。關關于數據庫對對象的討論已已經超越了本本文的范圍,要要詳細了解數數據庫對象,可可以查閱orracle手手冊。PL/SQL集集合集合合與其他語言言中的數組相相似,在ORR
48、ACLE77.3及以前前的版本中只只有一種集合合稱為PL/SQL表,這這種類型的集集合依然保留留,就是索引引(INDEEX_BY)表表,與記錄相相似,集合在在定義的時候候必須使用TTYPE語句句,然后才是是創(chuàng)建和使用用這種類型的的變量。集合的類型型PL/SQL有三三種類型的集集合. Indexx_by表. 嵌套套表. VARRAAY這三三種類型的集集合之間由許許多差異,包包括數據綁定定、稀疏性(sparssity)、數數據庫中的存存儲能力都不不相同。綁定定涉及到集合合中元素數量量的限制,VVARRAYY集合中的元元素的數量是是有限,Inndex_bby和嵌套表表則是沒有限限制的。稀疏疏性描述了
49、集集合的下標是是否有間隔,IIndex_by表總是是稀疏的,如如果元素被刪刪除了嵌套表表可以是稀疏疏的,但VAARRAY類類型的集合則則是緊密的,它它的下標之間間沒有間隔。Index_by表不能存儲在數據庫中,但嵌套表和VARRAY可以被存儲在數據庫中。雖然這三種類型的集合有很多不同之處,但他們也由很多相似的地方:. 都是一維的類似數組的結構. 都有內建的方法. 訪問由點分隔Index_by表Index_by表集合的定義語法如下:TYPE tyype_naame ISS TABLLE OF elemeent_tyype NNOT NUULL IINDEXBBY BINNARY_IINTERGG
50、ET;這里面重要要的關鍵字是是INDEXX BY BBINARYY_INTEERGET,沒沒有這個關鍵鍵字,那么集集合將是一個個嵌套表,eelemennt_typpe可以是任任何合法的PPL/SQLL數據類型,包包括:PLSS/INTEEGER、SSIGNTYYPE、和BBOOLEAAN。其他的的集合類型對對數據庫的數數據類型都有有限制,但IIndex_by表不能能存儲在數據據庫中,所以以沒有這些限限制。一一旦定義了iindex_by表,就就可以向創(chuàng)建建其他變量那那樣創(chuàng)建inndex_bby表的變量量:DECLAREE TYPEE symbbol_taab_typp IS TTABLE OF
51、VAARCHARR2(5) INDEXX BY BBINARYY_INTEEGER;ssymboll_tab symbool_tabb_typ;BEGINN嵌套表嵌套表非常常類似于Inndex_bby表,創(chuàng)建建的語法也非非常相似。使使用TYPEE語句,只是是沒有INDDEX BYY BINAARY_INNTEGERR子串。TYPE type_name IS TAABLE OOF eleement_type NOT NULLNOTT NULLL選項要求集集合所有的元元素都要有值值,elemment_ttype可以以是一個記錄錄,但是這個個記錄只能使使用標量數據據類型字段以以及只用于數數據庫的數據
52、據類型(不能能是PLS_INTEGGER,BOOOLEANN或SIGNNTYPE)。嵌套表和VARRAY都能作為列存儲在數據庫表中,所以集合自身而不是單個的元素可以為NULL,ORACLE稱這種整個集合為NULL的為自動設置為NULL(atomically NULL)以區(qū)別元素為NULL的情況。當集合為NULL時,即使不會產生異常,用戶也不能引用集合中的元素。用戶可以使用IS NULL操作符檢測集合是否為NULL。存儲在一個數據庫中的嵌套表并不與表中的其它數據存放在同一個數據塊中,它們實際上被存放在第二個表中。正如沒有order by子句select語句不能保證返回任何有順序的數據,從數據庫中
53、取回的嵌套表也不保證元素的順序。由于集合數據是離線存儲的,對于大型集合嵌套表是一個不錯的選擇。VARRAYVARRAY或數據變量都有元素的限制。想起他集合一樣VARRAY定義仍然使用TYPE語句,但關鍵字VARRAY或VARRYING ARRAY告訴ORACLE這是一個VARRAY集合。TYPE tyype_naame ISS VARRRAY|VVARYINNG ARRRAY (max_ssize) OFeleement_type NOT NULLmax_ssize是一一個整數,用用于標示VAARRAY集集合擁有的最最多元素數目目。VARRRAY集合的的元素數量可可以低于maax_sizze,
54、但不能能超過maxx_sizee。elemment_ttype是一一維元素的數數據類型,如如果elemment_ttype是記記錄,那么這這個記錄只能能使用標量數數據字段(與與嵌套標相似似)。NOTT NULLL子串表示集集合中的每一一個元素都必必須有值。與嵌套表表相似,VAARRAY能能夠自動為NNULL,可可以使用ISS NULLL操作符進行行檢測。與嵌嵌套表不同的的是,當VAARRAY存存儲在數據庫庫中時與表中中的其他數據據存放在同一一個數據塊中中。正象列的的排序保存在在表的SELLECT*中中一樣元素的的順序保存在在VARRAAY中。同樣樣由于集合是是在線存儲的的,VARRRAY很適合
55、合于小型集合合。使用集合象象記錄一樣,集集合可以在兩兩個層面上使使用:. 操作整整個集合. 訪問問集合中的單單個元素第一種情況況使用集合名名,第二種情情況使用下標標:ccollecction(subsccript)inddex_byy表的下標是是兩為的整數數,可以為正正也可以為負負,范圍是:-214774836447-211474833647。嵌嵌套表和VAARRAY表表示元素在集集合中的位置置,用戶很難難靈活設計下下標,這是因因為:. 嵌套表表開始是緊密密的(相對于于疏松). VAARRAY始始終保持緊密密. 這兩種集合合的下標都由由1開始初始化、刪刪除、引用集集合使用用集合之前必必須要初始
56、化化,對于Inndex_bby表初始化化是自動進行行的,但是對對于嵌套表和和VARRAAY就必須使使用內建的構構造函數。如如果重新調用用,嵌套表和和VARRAAY自動置NNULL,這這不只是元素素置NULLL,而是整個個集合置NUULL。給集集合內的元素素賦值需要使使用下標符號號。將一個集集合的值賦給給另一個集合合,只需要簡簡單的使用賦賦值操作符。Index_by集合初始化是最簡單的,只要涉及其中的一個元素集合就被初始化了。例:DECLAREETYPE symbool_tabb_typ IS TAABLE OOF VARRCHAR22(5) IINDEX BY BIINARY_INTEGGER
57、;TYYPE acccountt_tab_typ IIS TABBLE OFF accoount%RROWTYPPE INDDEX BYY BINAARY_INNTEGERR;symbbol_taab symmbol_ttab_tyyp;accounnt_tabb accoount_ttab_tyyp;neww_acctt_tab accouunt_taab_typp;BEGIIN-初始始化集合元素素147和-3SELEECT * INTO accouunt_taab(1477)FROMM accoounts WHEREE accoount_nnbr=1447;SELLECT * INTOO
58、accoount_ttab(-33)FROMM accoounts WHEREE accoount_nnbr=30003;IFF accoount_ttab(1447).baalanceeY集合保保持不變對VARRAYY非法EXIST()如果集合元素xx已經初始化化,則返回TTRUE, 否則返回FFALSEEXTEND在集合末尾添加加一個元素對Index_by非法EXTEND()在集合末尾添加加x個元素對Index_by非法EXTEND(,) 在集合末尾添加加元素n的xx個副本對Index_by非法FIRST返回集合中的第第一個元素的的下標號,對對于VARRRAY集合始始終返回1。LAST返回
59、集合中最后后一個元素的的下標號, 對于VARRRAY返回回值始終等于于COUNTT. LIMIT返回VARRYY集合的最大大的元素個數數,對于嵌套套表和對于嵌嵌套表和Inndex_bby為nulll Index_bby集合無用用NEXT()返回在元素x之之后及緊挨著著它的元素的的值,如果該該元素是最后后一個元素,則則返回nulll.PRIOR()返回集合中在元元素x之前緊緊挨著它的元元素的值,如如果該元素是是第一個元素素,則返回nnull。TRI M從集合末端開始始刪除一個元元素對于indexx_by不合合法TRIM()從集合末端開始始刪除x個元元素對index_by不合法法關于集合之之間的比
60、較集合不能能直接用于比比較,要比較較兩個集合,可可以設計一個個函數,該函函數返回一個個標量數據類類型。IF stocck_lisst1sttock_llist2 -非非法IF ssort_ccollecction(stockk_listt1)soort_coollecttion(sstock_list22) THEEN -合合法但可以比較較在集合內的的兩個元素。PL/SQL單單行函數和組組函數詳解函數是一種有零零個或多個參參數并且有一一個返回值的的程序。在SSQL中Orracle內內建了一系列列函數,這些些函數都可被被稱為SQLL或PL/SSQL語句,函函數主要分為為兩大類: 單行函函數 組函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑施工合同工程結算與付款流程規(guī)范
- 2025年度電力系統(tǒng)維護人員勞務派遣服務合同樣本
- 2025年度劇院租賃服務合同樣本
- 廣州2025年廣東廣州市天河區(qū)駿景小學編外聘用制專任教師招聘筆試歷年參考題庫附帶答案詳解
- 2025年中國光纜盤留架市場調查研究報告
- 2025至2031年中國靜音大彎軌行業(yè)投資前景及策略咨詢研究報告
- 2025年自動粘貼型圓砂紙項目可行性研究報告
- 2025至2031年中國網絡電梯行業(yè)投資前景及策略咨詢研究報告
- 2025年玻纖電機纏繞帶項目可行性研究報告
- 2025年油墨防干噴霧劑項目可行性研究報告
- 視頻會議室改造方案
- 2024年新人教版七年級上冊歷史全冊課件 第1課 遠古時期的人類活動
- 四川省2024年中考數學試卷十七套合卷【附答案】
- 北師大版二年級數學下冊全冊10套試卷(附答案)
- 【中考真題】廣東省2024年中考語文真題試卷
- 2025年湖南省長沙市中考數學模擬試卷(附答案解析)
- 五級人工智能訓練師(初級)職業(yè)技能等級認定考試題庫(含答案)
- 2022年內蒙古呼和浩特市中考化學真題(解析版)
- 2024-2025學年華東師大版數學七年級上冊計算題專項訓練
- DL∕T 5452-2012 變電工程初步設計內容深度規(guī)定
- 2024至2030年中國中檔商務酒店連鎖行業(yè)市場調查研究及發(fā)展戰(zhàn)略規(guī)劃報告
評論
0/150
提交評論