




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第8章PL/SQL概述8.1PL/SQL結(jié)構(gòu)PL/SQL組成PL/SQL是基于塊結(jié)構(gòu)的編程語言,PL/SQL最基本單元是塊(Block),每個塊由聲明、執(zhí)行、異常處理3個部分組成。Declare--聲明部分--聲明部分用來定義常量、變量、游標(biāo)、自定義異常、自定義數(shù)據(jù)類型等。這一部分在PL/SQL塊中是可選的。Begin--執(zhí)行部分--執(zhí)行部分是PL/SQL塊的主體,包括的是可執(zhí)行代碼,體現(xiàn)程序的功能。這一部分在PL/SQL塊是必選的。Exception--異常處理部分--異常處理部分用來處理執(zhí)行過程中發(fā)生的錯誤。如果塊正常執(zhí)行,則塊正常結(jié)束,否則從出現(xiàn)錯誤的語句開始,轉(zhuǎn)至異常處理部分開始執(zhí)行異常處理。這一部分在PL/SQL塊中是可選的。END;--塊結(jié)束標(biāo)志
注意:每個塊都是一個可執(zhí)行的單元,塊可以嵌套到其它塊中。8.1PL/SQL結(jié)構(gòu)PL/SQL塊實例下面是關(guān)于塊的實例。(1)只包含執(zhí)行部分的塊實例。Begindbms_output.put_line('Helloworld!');End;上面代碼中只包含了塊的執(zhí)行部分,通過調(diào)用dbms_output包中的put_line過程把參數(shù)包含的內(nèi)容顯示在屏幕上。關(guān)于輸出包、過程等相關(guān)內(nèi)容的討論將在后續(xù)章展開。(2)包含聲明部分和執(zhí)行部分的塊實例。Declarev_stringvarchar2(20):='Helloworld!';Begindbms_output.put_line(v_string);End;上面代碼中的塊包含了聲明部分和執(zhí)行部分,聲明部分包含了變量的定義及初始化,關(guān)于變量定義在本章后續(xù)有詳細(xì)討論;塊的執(zhí)行部分實現(xiàn)了對變量內(nèi)容的在屏幕的顯示。8.1PL/SQL結(jié)構(gòu)PL/SQL塊實例(3)包含完整結(jié)構(gòu)的塊實例。Declarev_stringvarchar2(20):='Helloworld!';Begindbms_output.put_line(v_string);Exceptionwhenothersthendbms_output.put_line('發(fā)生未知錯誤');End;上面代碼在實例2的基礎(chǔ)上添加了異常處理部分,當(dāng)代碼執(zhí)行發(fā)生未知錯誤時,給出相應(yīng)提示。關(guān)于異常處理內(nèi)容后續(xù)章詳細(xì)討論。注意:塊的執(zhí)行用“/”,所在會話要開啟屏幕打印:setserveroutputon.8.2PL/SQL聲明在PL/SQL塊中的聲明部分,可以聲明常量、變量、數(shù)據(jù)類型、游標(biāo)等。常量和變量名要遵守PL/SQL標(biāo)識符命名規(guī)則。標(biāo)識符必須以字母開頭,可以包含字母、數(shù)字、下劃線以及$和#符號,最長不超過30個字符,不能與PL/SQL保留字相同,不區(qū)分大小寫。聲明的方法如下:Declarevariable_name[CONSTANT]type[NOTNULL][:=value];其中variable_name是指變量名稱,[CONSTANT]是指是否為常量,type為變量的數(shù)據(jù)類型,[NOTNULL]指是否為空,value是對變量進行初始化。普通變量在聲明時建議以v_開頭,常量聲明時以c_開頭。8.2PL/SQL聲明PL/SQL數(shù)據(jù)類型
在PL/SQL中定義變量或常量時,必須指定?個數(shù)據(jù)類型,同時為增強程序的穩(wěn)定性,數(shù)據(jù)類型會在編譯時?不是在運?時被檢查。PL/SQL提供多種數(shù)據(jù)類型,可以分為以下4?類:標(biāo)量類型:?來保存單個值的數(shù)據(jù)類型,包含字符型、數(shù)字型、布爾型和?期型。復(fù)合類型:復(fù)合類型是具有內(nèi)部?組件的類型,可以包含多個標(biāo)量類型作為其屬性。復(fù)合類型包含記錄、嵌套表、索引表和變長數(shù)組。引?類型:引?類型是?個指向不同存儲位置的指針,引?類型包含REFCURSOR和REF這兩種。LOB類型:LOB類型?稱?對象類型,?來處理?進制和?于4GB的字符串。下面介紹幾個常用的數(shù)據(jù)類型。8.2PL/SQL聲明標(biāo)量類型1)字符型(1)固定字符串長度類型:CHARCHAR存儲固定的字符數(shù)據(jù),其有?個可選的整型值參數(shù)?來指定字符的長度,最?32767個字節(jié),CHAR的聲明語法如下:CHAR[(maximum_size[CHAR|BYTE])]其中,maximum_size?于指定字符的長度,其值不能是常量或變量,只能是1~32767之間的整型數(shù)字,該參數(shù)的默認(rèn)值為1。注意:盡管在PL/SQL中可以向CHAR類型指定32767個長度的字符,但是在Oracle數(shù)據(jù)庫中,CHAR類型字段的最?長度為2000個字節(jié)。(2)可變字符長度類型:VARCHAR2VARCHAR2存儲變長字符串,當(dāng)定義?個變長字符串時,必須要指定字符串的最?長度,其值范圍為1~32767個字節(jié),在指定長度時也可以選擇性地指定CHAR或BYTE參數(shù),語法如下:VARCHAR2[(maximum_size[CHAR|BYTE])]其中,maximum_size?于指定最?的長度,不能使?常量或變量來指定這個值,必須使?整型數(shù)值。與定長的CHAR類型的最?的不同在于實際的基于字節(jié)的長度依據(jù)實際賦給變量的具體長度?定,這依賴于數(shù)據(jù)庫的字符集設(shè)置,例如UnicodeUTF-8字符集使?3個字節(jié)表??個字符。8.2PL/SQL聲明標(biāo)量類型2)數(shù)值型PL/SQL程序中最常用的數(shù)值型為NUMBER類型。NUMBER類型及可以表?整數(shù),亦可以表?浮點數(shù)。其聲明語法如下:NUMBER[(precision,scale)]其中,precision指定了所允許的值的總長度,也就是數(shù)值中所有數(shù)字位的個數(shù),最?值為38,scale為刻度,指定了?數(shù)點右邊的數(shù)字位的個數(shù),可以是負(fù)數(shù),表?由?數(shù)點開始向左進?計算數(shù)字的個數(shù)。8.2PL/SQL聲明標(biāo)量類型3)日期型DATE類型?來存儲時間和?期信息,包含世紀(jì)、年、?、?、?時、分鐘、秒,但不包含秒的?數(shù)部分。4)布爾型OraclePL/SQL數(shù)據(jù)類型相比SQL數(shù)據(jù)類型,開始支持布爾類型。布爾類型關(guān)鍵字為BOOLEAN,取值可以為ture、false或者NULL。布爾值僅?在邏輯操作中,?不能?PL/SQL的布爾值與數(shù)據(jù)庫交互。8.2PL/SQL聲明復(fù)合類型1)記錄類型
記錄類型類似于C語言中的結(jié)構(gòu)數(shù)據(jù)類型,它把邏輯相關(guān)的、分離的、基本數(shù)據(jù)類型的變量組成一個整體存儲起來,它必須包括至少一個標(biāo)量型或RECORD數(shù)據(jù)類型的成員,稱作PL/SQLRECORD的域(FIELD),其作用是存放互不相同但邏輯相關(guān)的信息。在使用記錄數(shù)據(jù)類型變量時,需要先在聲明部分先定義記錄的組成、記錄的變量,然后在執(zhí)行部分引用該記錄變量本身或其中的成員。記錄類型定義語法如下:TYPE
record_name
IS
RECORD(v1
data_type1
[NOT
NULL]
[:=
default_value
],v2
data_type2
[NOT
NULL]
[:=
default_value
],
......vn
data_typen
[NOT
NULL]
[:=
default_value
]
);8.2PL/SQL聲明復(fù)合類型2)數(shù)組類型數(shù)組是具有相同數(shù)據(jù)類型的一組成員的集合。每個成員都有一個唯一的下標(biāo),它取決于成員在數(shù)組中的位置。在PL/SQL中,數(shù)組數(shù)據(jù)類型是VARRAY。定義VARRY數(shù)據(jù)類型語法如下:TYPE<數(shù)組類型名>ISVARRAY(<MAX_SIZE>)OF<數(shù)據(jù)類型>;例:數(shù)組類型使用舉例。DeclareTYPEvarray_testISVARRAY(3)OFVARCHAR(10);--數(shù)組聲明v_arrayvarray_test;--數(shù)組類型變量聲明Beginv_array:=varray_test('計算機','軟件','網(wǎng)絡(luò)');--數(shù)組賦值dbms_output.put_line('相關(guān)信息:'||v_array(1)||''||v_array(2)||''||v_array(3));v_array(3):='通信';--單個數(shù)組成員賦值dbms_output.put_line(v_array(3));End;8.2PL/SQL聲明LOB對象類型LOB(LargeObject)類型?稱為?對象類型,包含了BFILE、BLOB、CLOB和NCLOB等類型,其最?可存儲4GB的?結(jié)構(gòu)數(shù)據(jù),允許?效地、隨機地分段訪問數(shù)據(jù)。LOB類型通常?來存儲?本、圖像、聲?和視頻等?型數(shù)據(jù)。LOB對象通過定位器來操作數(shù)據(jù),因此在LOB類型中?般會包含?個定位器,定位器?來指向LOB數(shù)據(jù)。?如當(dāng)使?查詢語句選擇?個BLOB類型的列時,將只有定位器被返回。通過定位器來完成對?型數(shù)據(jù)對象的操作。LOB包含的?種數(shù)據(jù)類型及其含義如下所?:BFILE:BFILE?來在數(shù)據(jù)庫外的操作系統(tǒng)?件中存儲?型的?進制?件,在數(shù)據(jù)庫中,每?個BFILE存儲著?個?件定位器,?來指向服務(wù)器上的?型?進制?件。BLOB:BLOB類型?來在數(shù)據(jù)庫內(nèi)部?型的?進制對象,每?個BLOB變量存儲?個定位器指向?個?型?進制對象,其??不能超過4GB字節(jié)。BLOB可以參與整個事務(wù)處理,可以被復(fù)制和恢復(fù)。?般使?DBMS_LOB來提交和回滾事務(wù)。CLOB:?來在數(shù)據(jù)庫中存儲?型的字符型數(shù)據(jù),其??也不可超過4GB。NCLOB:?來在數(shù)據(jù)庫中存儲?型的NCHAR類型數(shù)據(jù),NCLOB可以?持特定長字符集和變長字符集,可以參與事務(wù)的處理,可以被恢復(fù)和復(fù)制。8.2PL/SQL聲明幾種變量聲明1.普通變量建議普通變量名以v_開頭,其聲明語法如下:變量名數(shù)據(jù)類型[:=初值|default默認(rèn)值];例:寫一個PL/SQL程序,查詢7788員工的姓名,輸出形式為XXXX員工姓名是:xxxx。
Declarev_enamevarchar2(10);Beginselectenameintov_enamefromempwhereempno=7788;dbms_output.put_line('7788員工姓名是:'||v_ename);End;8.2PL/SQL聲明幾種變量聲明2.替代變量替代變量的作用是程序運行時從鍵盤接收數(shù)據(jù)。聲明方法時&變量名。使用替代變量可以提高代碼的通用性。例:替代變量的使用。Declarev_enamevarchar2(10);v_ename1varchar2(10);v_empnonumber(4);Beginv_empno:=&v_empno;--替代變量,這時,v_empno的值從鍵盤接收。selectenameintov_enamefromempwhereempno=v_empno;dbms_output.put_line(v_empno||'員工姓名是:'||v_ename);End;上邊的程序塊編譯一次,可以執(zhí)行多次,每次輸入可以接收不同的值。8.2PL/SQL聲明幾種變量聲明3.%type在程序中,需要聲明一個變量與已有變量或者表中某個屬性列的數(shù)據(jù)類型保持一致,這時需要用%type。聲明一個變量與已有變量類型保持一致語法為:變量名已有變量%type;,聲明一個變量與表中某列類型保持一致語法為:變量名表名.列名%type;。%type使用舉例1:寫一個PL/SQL程序,查詢7788員工的姓名。declarev_enameemp.ename%type;v_ename1v_ename%type;v_empnoemp.empno%type;beginv_empno:=&v_empno;selectenameintov_enamefromempwhereempno=v_empno;dbms_output.put_line(v_empno||'員工姓名是:'||v_ename);end;8.2PL/SQL聲明幾種變量聲明4.%rowtype當(dāng)聲明一個變量與已有表的結(jié)構(gòu)保持一致,可以使用%rowtype,此時聲明的變量是一個記錄變量,建議以rec_開頭。%rowtype使用舉例:寫一個PL/SQL語句,查詢7788員工的姓名、參加工作時間、工資、獎金、所在部門號。Declarerec_empemp%rowtype;Beginselect*intorec_empfromempno=7788;dbms_output.put_line('7788員工的姓名;'||rec_emp.ename||''||'參加工作時間:'|||rec_emp.hiredate||''||'工資:'|||rec_emp.sal||''||'獎金:'|||rec_m||'所在部門號'|||rec_emp.deptno);End;8.2PL/SQL聲明變量作用域變量的作用域是指變量的有效作用范圍,與其它高級語言類似,PL/SQL的變量作用范圍特點是:變量的作用范圍是在所引用的程序單元(塊、子程序、包)內(nèi)。即從聲明變量開始到該塊的結(jié)束。一個變量只在所引用的塊內(nèi)是可見的。當(dāng)一個變量超出了作用范圍,PL/SQL引擎就釋放用來存放該變量的空間。在子塊中重新定義該變量后,它的作用僅在該塊內(nèi)。8.2PL/SQL聲明變量作用域下邊是一個說明變量作用域的例子:Declarev_test1varchar2(10):='v_test1變量作用范圍從聲明開始到整個塊結(jié)束';Begindbms_output.put_line(v_test1);--聲明一個子塊Declarev_test2varchar2(10):='v_test2變量作用范圍從聲明開始到所在子塊結(jié)束';Begindbms_output.put_line(v_test1);dbms_output.put_line(v_test2);End;--子塊結(jié)束,v_test2作用范圍到此結(jié)束End;--塊結(jié)束,v_test1作用范圍到此結(jié)束8.3程序控制語句1NULL語句NULL語句不做任何動作,較少使用,一般用來增加程序的可讀性。其語法為:null;2賦值語句賦值語句語法為:<variable>:=<expression>;如:v_jobvarchar2(10):='CLERK';3條件控制語句條件控制語句也可以分支語句,條件控制用于根據(jù)條件執(zhí)行一系列語句,包括IF語句和CASE語句。8.3程序控制語句
IF語句1)單分支IF..THEN..ENDIF;語法:IFconditionTHENStatementsENDIF;單分支舉例:查詢特定員工的工資,若工資超過3000,顯示高工資。Declarev_salemp.sal%type;v_empnoemp.empno%type;Beginv_empno:=&v_empno;selectsalintov_salfromempwhereempno=v_empno;ifv_sal>3000thendbms_output.put_line(v_empno||'高工資');endif;End;8.3程序控制語句
IF語句2)雙分支IF..THEN...ELSE..ENDIF;語法:IFconditionTHENStatements1ELSEStatements2ENDIF;雙分支舉例:查詢特定員工的工資,若工資超過3000,顯示高工資,否則顯示低工資。Declarev_salemp.sal%type;v_empnoemp.empno%type;Beginv_empno:=&v_empno;selectsalintov_salfromempwhereempno=v_empno;ifv_sal>3000thendbms_output.put_line(v_empno||'高工資');elsedbms_output.put_line(v_empno||'低工資');endif;End;8.3程序控制語句
IF語句3)多分支IF..THEN..ELSIF..ELSE..ENDIF;語法:IFcondition1THENStatements1ELSIFcondition2THENStatements2ELSEStatements3ENDIF;多分支舉例:查詢特定員工的工資,若工資超過3000,顯示高工資;若工資在2000到3000之間顯示一般工資;否則顯示低工資。Declarev_salemp.sal%type;v_empnoemp.empno%type;Beginv_empno:=&v_empno;selectsalintov_salfromempwhereempno=v_empno;ifv_sal>3000thendbms_output.put_line(v_empno||'高工資');elsifv_salbetween2000and3000thendbms_output.put_line(v_empno||'一般工資');elsedbms_output.put_line(v_empno||'低工資');endif;End;8.3程序控制語句CASE語句CASE語句分為簡單CASE語句和搜索CASE語句兩種形式。1)簡單CASE語句語法:CASE表達式WHEN值1THEN分支1;WHEN值2THEN分支2;......[ELSE分支n;]ENDCASE;8.3程序控制語句CASE語句2)搜索CASE語句語法:CASEWHEN條件表達式1THEN分支1;WHEN條件表達式2THEN分支2;......[ELSE分支n;]ENDCASE;8.3程序控制語句循環(huán)控制語句循環(huán)控制語句,用于重復(fù)執(zhí)行一系列語句。循環(huán)控制包括LOOP和EXIT語句,使用EXIT語句表示立即退出循環(huán),使用EXITWHEN語句可以根據(jù)條件結(jié)束循環(huán)。循環(huán)結(jié)構(gòu)共有三種類型,分別是簡單循環(huán)、WHILE循環(huán)和FOR循環(huán)。書寫循環(huán)語句時,一定要特別注意循環(huán)結(jié)束條件,避免出現(xiàn)死循環(huán)。1.簡單循環(huán)語法:LOOPstatements;Exitwhen條件;ENDLOOP;8.3程序控制語句循環(huán)控制語句2.WHILE循環(huán)語法:While條件LOOPstatements;ENDLOOP;如:使用WHILE循環(huán)輸出1到6之間的立方數(shù)。Declarev_powernumber:=1;Beginwhilev_power<7loopdbms_output.put_line(v_power||'的立方為'||power(v_power,3));v_power:=v_power+1;endloop;End;8.3程序控制語句循環(huán)控制語句3.FOR循環(huán)語法:FOR循環(huán)控制變量IN[REVERSE]下限..上限LOOPstatements;ENDLOOP;其中:循環(huán)控制變量主要用來控制循環(huán)次數(shù),該變量不需要事先聲明,循環(huán)次數(shù)取決于下限和上限的值;循環(huán)控制變量的值在循環(huán)體內(nèi)部不可以改變。如:使用FOR循環(huán)輸出1到6之間的立方數(shù)。Declarev_powernumber:=1;Beginforiin1..6loopdbms_output.put_line(v_power||'的立方為'||power(v_power,3));v_power:=v_power+1;endloop;End;8.4游標(biāo)PL/SQL程序中的selectintofrom子句只能用來處理查詢返回是一行數(shù)據(jù)的情況,而在實際應(yīng)用中,查詢返回值為多行數(shù)據(jù)的情況很常見。為了處理查詢語句返回多行數(shù)據(jù)的情況,Oracle數(shù)據(jù)庫在PL/SQL程序中引入了游標(biāo)。游標(biāo)的本質(zhì)上是一個指向特定內(nèi)存區(qū)域的指針,主要用來處理表中多行記錄的情況,其分為隱式游標(biāo)和顯式游標(biāo)。1.隱式游標(biāo)在塊中執(zhí)行一個SQL語句時,服務(wù)器將自動創(chuàng)建一個隱式游標(biāo),該游標(biāo)是內(nèi)存中的工作區(qū),存儲了執(zhí)行SQL語句的結(jié)果,可以通過隱式游標(biāo)的屬性來了解操作的狀態(tài)和結(jié)果,進而控制程序的流程。隱式游標(biāo)可以使用名字SQL來訪問,但要注意,通過SQL游標(biāo)名總是只能訪問前一個處理操作或單行查詢操作的游標(biāo)屬性。8.4游標(biāo)2.顯式游標(biāo)顯式游標(biāo)需要定義,在使用之前要打開并提取數(shù)據(jù),使用完畢后要關(guān)閉,主要用于查詢返回值是多行的情況。1)顯式游標(biāo)的使用顯式游標(biāo)的使用包括聲明游標(biāo)、打開游標(biāo)、提取數(shù)據(jù)和關(guān)閉游標(biāo)四個步驟:
(1)聲明游標(biāo):出現(xiàn)在塊的聲明部分,定義游標(biāo)名以及與其相對應(yīng)的select
語句。聲明語法為:cursorcursor_name[(參數(shù)1,,,,)]isselect子句;其中,游標(biāo)參數(shù)格式為:參數(shù)名數(shù)據(jù)類型,此時要注意在指定參數(shù)數(shù)據(jù)類型時,不能指定寬度。(2)打開游標(biāo):此時執(zhí)行游標(biāo)所對應(yīng)的select
語句,并將其查詢結(jié)果讀入特定內(nèi)存區(qū)域,并且指針指向內(nèi)存區(qū)域的首部,標(biāo)識游標(biāo)結(jié)果集合。如果游標(biāo)查詢語句中帶有FOR
UPDATE選項,OPEN
語句還將鎖定數(shù)據(jù)庫表中游標(biāo)結(jié)果集合對應(yīng)的數(shù)據(jù)行。打開游標(biāo)語法為:OPENcursor_name[(參數(shù)值,,,)];(3)提取數(shù)據(jù):將檢索結(jié)果集合中的數(shù)據(jù)行,讀入指定的變量中。
提取數(shù)據(jù)語法為:FETCHcursor_nameinto變量1,,,;執(zhí)行FETCH語句時,每次返回一個數(shù)據(jù)行,然后自動將游標(biāo)移動指向下一個數(shù)據(jù)行。當(dāng)檢索到最后一行數(shù)據(jù)時,如果再次執(zhí)行FETCH語句,將操作失敗,并將游標(biāo)屬性%NOTFOUND置為TRUE。所以每次執(zhí)行完FETCH語句后,檢查游標(biāo)屬性%NOTFOUND就可以判斷FETCH語句是否執(zhí)行成功并返回一個數(shù)據(jù)行,以便確定是否給對應(yīng)的變量賦了值。(4)關(guān)閉游標(biāo):當(dāng)提取和處理完游標(biāo)結(jié)果集合數(shù)據(jù)后,應(yīng)及時關(guān)閉游標(biāo),以釋放該游標(biāo)所占用的系統(tǒng)資源,并使該游標(biāo)的工作區(qū)變成無效,此時不能再使用FETCH
語句取其中數(shù)據(jù)。關(guān)閉后的游標(biāo)可以使用OPEN
語句重新打開。關(guān)閉游標(biāo)語法為:CLOSEcursor_name;8.4游標(biāo)例:寫一個PL/SQL程序,查詢每個員工的姓名和參加工作時間。Declarecursorcur1isselectempno,ename,hiredatefromemp;--聲明游標(biāo)v_empnoemp.empno%type;v_enameemp.ename%type;v_hiredateemp.hiredate%type;Beginopencur1;--打開游標(biāo)fetchcur1intov_empno,v_ename,v_hiredate;--數(shù)據(jù)提取dbms_output.put_line(v_empno||''||v_ename||''||v_hiredate||''||cur1%rowcount);closecur1;--關(guān)閉游標(biāo)End;8.4游標(biāo)顯式游標(biāo)屬性顯式游標(biāo)屬性名與隱式游標(biāo)一樣,但其含義不一樣,顯式游標(biāo)屬性具體見表8-2。注:從表8-2可以看到,出%ISOPEN屬性外,顯式游標(biāo)的其余三個屬性都是跟數(shù)據(jù)提取操作相關(guān)的,所以在使用這三個屬性之前,一定要有一個游標(biāo)數(shù)據(jù)提取操作。8.4游標(biāo)顯式游標(biāo)屬性顯式游標(biāo)屬性名與隱式游標(biāo)一樣,但其含義不一樣,顯式游標(biāo)屬性具體見表8-2。注:從表8-2可以看到,出%ISOPEN屬性外,顯式游標(biāo)的其余三個屬性都是跟數(shù)據(jù)提取操作相關(guān)的,所以在使用這三個屬性之前,一定要有一個游標(biāo)數(shù)據(jù)提取操作。8.4游標(biāo)游標(biāo)記錄變量聲明的游標(biāo)可以看作一個記錄變量,此時可以聲明游標(biāo)記錄變量,跟已有游標(biāo)結(jié)構(gòu)保持一致,聲明方法為:記錄變量名游標(biāo)名%rowtype;對上邊while循環(huán)例子代碼進一步優(yōu)化:Declarecursorcur1isselectempno,ename,hiredatefromemp;rec_cur1cur1%rowtype;--聲明游標(biāo)記錄變量Beginopencur1;fetchcur1intorec_cur1;whilecur1%foundloopdbms_output.put_line(cur1%rowcount||''||rec_cur1.empno||''||rec_cur1.ename||''||rec_cur1.hiredate);fetchcur1intorec_cur1;endloop;closecur1;End;8.4游標(biāo)for循環(huán)處理游標(biāo)使用for循環(huán)處理游標(biāo)時,相比簡單循環(huán)和while循環(huán),要更加快捷。當(dāng)for循環(huán)開始時,游標(biāo)自動打開(不需要open),每循環(huán)一次系統(tǒng)自動讀取游標(biāo)當(dāng)前行的數(shù)據(jù)(不需要fetch),當(dāng)退出for循環(huán)時,游標(biāo)被自動關(guān)閉(不需要使用close)。使用游標(biāo)for循環(huán)的時候不能使用open語句,fetch語句和close語句,否則會產(chǎn)生錯誤。語法形式為:for循環(huán)控制變量incursor[(參數(shù)值,,,)]loop
循環(huán)體;endloop;其中:循環(huán)控制變量為游標(biāo)for循環(huán)語句隱含聲明的索引變量,該變量為記錄變量,其結(jié)構(gòu)與游標(biāo)查詢語句返回的結(jié)構(gòu)集合的結(jié)構(gòu)相同。在程序中可以通過引用該索引記錄變量元素來讀取所提取的游標(biāo)數(shù)據(jù)。如果在游標(biāo)查詢語句的選擇列表中存在計算列,則必須為這些計算列指定別名后才能通過游標(biāo)for循環(huán)語句中的索引變量來訪問這些列數(shù)據(jù)。另外,PL/SQL程序還允許在游標(biāo)for循環(huán)語句中使用子查詢來實現(xiàn)游標(biāo)功能。8.4游標(biāo)for循環(huán)處理游標(biāo)for循環(huán)處理游標(biāo)舉例:寫一個PL/SQL程序,查詢每個員工的姓名和參加工作時間,要求使用for循環(huán)處理游標(biāo)。Declarecursorcur1isselectempno,ename,hiredatefromemp;Beginforrec_cur1incur1loopdbms_output.put_line(rec_cur1.empno||''||rec_cur1.ename||''||rec_cur1.hiredate||''||cur1%rowcount);endloop;End;8.5異常處理
系統(tǒng)預(yù)定義異常預(yù)定義異常使用舉例:Declarecursorcur1isselectempno,ename,hiredatefromemp;rec_cur1cur1%rowtype;Beginfetchcur1intorec_cur1;whilecur1%foundloopdbms_output.put_line(rec_cur1.empno);fetchcur1intorec_cur1;endloop;closecur1;Exceptionwheninvalid_cursorthendbms_output.put_line('游標(biāo)未打開');End;8.5異常處理
用戶自定義異常程序執(zhí)行過程中,出現(xiàn)編程人員認(rèn)為的非正常情況。對這種異常情況的處理,需要用戶在程序中定義,然后顯式地在程序中將其引發(fā)。用戶定義的異常錯誤是通過顯式
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝合同采購6篇
- 專業(yè)網(wǎng)站建設(shè)試題及答案
- 上海土建安全員模擬題庫及答案
- 糖果加工合同6篇
- 室內(nèi)設(shè)計課件
- 城區(qū)水環(huán)境綜合治理勞務(wù)施工合同6篇
- 電動吊籃租賃合同與電動工具租賃合同2篇
- 幼兒園愛衛(wèi)生講文明
- 健康促進縣區(qū)課件
- 機械設(shè)計及其制度課件
- 《養(yǎng)老機構(gòu)重大事故隱患判定標(biāo)準(zhǔn)》主要內(nèi)容解讀
- 米字格A4打印版
- 陜西省西安市蓮湖區(qū)2023-2024學(xué)年六年級下學(xué)期期末英語試題
- 企業(yè)錄用通知書offer模板
- 人際溝通與禮儀智慧樹知到課后章節(jié)答案2023年下河北工業(yè)職業(yè)技術(shù)學(xué)院
- 臨床藥理學(xué)(完整課件)
- 田徑運動會競賽團體總分記錄表
- 《中小學(xué)綜合實踐活動課程指導(dǎo)綱要》
- 公共資源交易中心政府采購業(yè)務(wù)流程圖
- 建筑施工單位職業(yè)危害歸類表
- 重慶市醫(yī)療服務(wù)價格-重慶市《醫(yī)療服務(wù)價格手冊-》
評論
0/150
提交評論