ORACLE下PLSQL編程基礎(chǔ)_第1頁
ORACLE下PLSQL編程基礎(chǔ)_第2頁
ORACLE下PLSQL編程基礎(chǔ)_第3頁
ORACLE下PLSQL編程基礎(chǔ)_第4頁
ORACLE下PLSQL編程基礎(chǔ)_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、PL/SQL語言基礎(chǔ)語言基礎(chǔ) PL/SQL語言的結(jié)構(gòu)語言的結(jié)構(gòu) p塊(塊(BlockBlock)是)是PL/SQLPL/SQL程序中最基本的結(jié)構(gòu)。程序中最基本的結(jié)構(gòu)。pPL/SQLPL/SQL的塊由變量聲明、程序代碼和異常處理代碼的塊由變量聲明、程序代碼和異常處理代碼3 3部分組成。部分組成。DECLARE -標(biāo)記聲明部分標(biāo)記聲明部分 -此處用來定義常量、變量、類型和游標(biāo)等此處用來定義常量、變量、類型和游標(biāo)等BEGIN -標(biāo)記程序體部分開始標(biāo)記程序體部分開始 -此處用來編寫各種此處用來編寫各種PL/SQL語句、函數(shù)和存儲(chǔ)過程語句、函數(shù)和存儲(chǔ)過程EXCEPTION -標(biāo)記異常處理部分開始標(biāo)記異常

2、處理部分開始 -此處用來編寫異常處理代碼此處用來編寫異常處理代碼END; -標(biāo)記程序體部分結(jié)束標(biāo)記程序體部分結(jié)束PL/SQL示例程序示例程序 p 示例程序的代碼如下:示例程序的代碼如下:SET ServerOutput ON;DECLARE /* 聲明變量 */ var_UserName VARCHAR2(100);BEGIN SELECT UserName INTO var_UserName FROM Users WHERE UserId = 1; dbms_output.put_line(var_UserName); -輸出變量END; 說明: (1)SET ServerOutput ON

3、; 用于將環(huán)境變量serveroutput設(shè)為打開狀態(tài),從而使PL/SQL程序能夠在SQL*PLUS中輸出結(jié)構(gòu)。 (2)使用函數(shù)dbms_output.put_line(var_UserName);可以可以輸出參數(shù)的值。輸出參數(shù)的值。 PL/SQL組件組件 p聲明部分聲明部分 p執(zhí)行部分執(zhí)行部分 p異常處理部分異常處理部分 聲明部分聲明部分 pDECLAREDECLARE對變量進(jìn)行聲明:對變量進(jìn)行聲明:DECLARE ; ; ;p常量名和變量名的定義規(guī)則:常量名和變量名的定義規(guī)則:標(biāo)識符必須以字符開頭。標(biāo)識符中可以包含數(shù)字(09)、下劃線(_)、“$”和“#”。標(biāo)識符最大長度為30。標(biāo)識符不區(qū)

4、分大小寫,TypeName和typename是完全相同的。不能使用PL/SQL保留字使用標(biāo)識符名,例如不能聲明變量名為DECLARE。pPL/SQLPL/SQL中常用數(shù)據(jù)類型:中常用數(shù)據(jù)類型:BLOB 二進(jìn)制大對象,可以用來保存圖像和文檔等二進(jìn)制數(shù)據(jù)。BOOLEAN 布爾數(shù)據(jù)類型,支持TRUE/FALSE值。CHAR 固定長度字符串。CLOB 字符大對象,可用來保存多達(dá)4GB的字符數(shù)據(jù)。DATE 存儲(chǔ)全部日期的固定長度字符串。LONG 可變長度字符串。NUMBER 可變長度數(shù)值。integer 表示整數(shù)RAW 二進(jìn)制數(shù)據(jù)的可變長度字符串。VARCHAR2 可變長度字符串。(1 1)聲明常量。聲

5、明常量的基本格式如下:)聲明常量。聲明常量的基本格式如下: constant := ; 關(guān)鍵字關(guān)鍵字constantconstant表示聲明的是常量。要聲明一個(gè)程序表示聲明的是常量。要聲明一個(gè)程序的版本信息常量的版本信息常量conversionconversion:conversion constant VARCHAR2(20) := 1.0.01;【例】定義變量【例】定義變量conVersion,保存指定產(chǎn)品的版本信息。,保存指定產(chǎn)品的版本信息。然后調(diào)用然后調(diào)用dbms_output.put_line輸出常量的值:輸出常量的值: SET ServerOutput ON; DECLARE co

6、nVersion constant VARCHAR2(20) := 1.0.01; BEGIN dbms_output.put_line(conVersion); END;程序的運(yùn)行結(jié)果為: 1.0.01(2 2)聲明變量。聲明變量的基本格式如下:)聲明變量。聲明變量的基本格式如下: (寬度寬度) := ;【例】聲明一個(gè)變量【例】聲明一個(gè)變量DatabaseDatabase保存數(shù)據(jù)庫信息:保存數(shù)據(jù)庫信息:SET ServerOutput ON;DECLARE Database VARCHAR2(50) := Oracle 10g ;BEGIN dbms_output.put_line(Data

7、base);END;程序的運(yùn)行結(jié)果為:Oracle 10g 執(zhí)行部分執(zhí)行部分 1 1賦值語句賦值語句 【例】在程序的運(yùn)行過程中,對變量進(jìn)行賦值操作:【例】在程序的運(yùn)行過程中,對變量進(jìn)行賦值操作:SET ServerOutput ON;DECLARE Database VARCHAR2(50); BEGIN Database := Oracle 10g ; dbms_output.put_line(Database);END;執(zhí)行部分執(zhí)行部分2 2條件語句條件語句IF IF IF THEN ELSIF THEN ELSE END IF;執(zhí)行部分執(zhí)行部分【例】演示【例】演示IFIF語句的使用方法:

8、語句的使用方法:SET ServerOutput ON;DECLARE Num INTEGER := -11; BEGIN IF Num 0 THEN dbms_output.put_line(正數(shù)); ELSE dbms_output.put_line(0); END IF;END;執(zhí)行部分執(zhí)行部分3 3分支語句分支語句CASE CASE CASE WHEN THEN 值1 WHEN THEN 值2 WHEN THEN 值n ELSE 值n + 1END;執(zhí)行部分執(zhí)行部分【例】使用【例】使用CASECASE語句根據(jù)給定的整數(shù)輸出對應(yīng)的星期值:語句根據(jù)給定的整數(shù)輸出對應(yīng)的星期值:SET Ser

9、verOutput ON;DECLARE varDAY INTEGER := 3; Result VARCHAR2(20);BEGIN Result := CASE varDAY WHEN 1 THEN 星期一 WHEN 2 THEN 星期二 WHEN 3 THEN 星期三 WHEN 4 THEN 星期四 WHEN 5 THEN 星期五 WHEN 6 THEN 星期六 WHEN 7 THEN 星期七 ELSE 數(shù)據(jù)越界 END; dbms_output.put_line(Result);END;執(zhí)行部分執(zhí)行部分4 4循環(huán)語句循環(huán)語句LOOPLOOPEXITEXITEND END LOOP IF

10、 THEN EXIT END IF END LOOP;執(zhí)行部分執(zhí)行部分【例【例】LOOPLOOPEXITEXITENDEND語句的示例程序:語句的示例程序:SET ServerOutput ON;DECLARE v_Num INTEGER := 1; v_Sum INTEGER := 0;BEGIN LOOP v_Sum := v_Sum + v_Num; dbms_output.put_line(v_Num); IF v_Num = 3 THEN EXIT; END IF; dbms_output.put_line( + ); v_Num := v_Num + 1; END LOOP; db

11、ms_output.put_line( = ); dbms_output.put_line(v_Sum);END;執(zhí)行部分執(zhí)行部分5 5循環(huán)語句循環(huán)語句LOOPLOOPEXIT WHENEXIT WHENEND END LOOP EXIT WHEN END LOOP;執(zhí)行部分執(zhí)行部分【例】用【例】用LOOPLOOPEXIT WHENEXIT WHENENDEND語句來實(shí)現(xiàn):語句來實(shí)現(xiàn):SET ServerOutput ON;DECLARE v_Num INTEGER := 1; v_Sum INTEGER := 0;BEGIN LOOP v_Sum := v_Sum + v_Num; dbms

12、_output.put_line(v_Num); EXIT WHEN v_Num = 3; dbms_output.put_line( + ); v_Num := v_Num + 1; END LOOP; dbms_output.put_line( = ); dbms_output.put_line(v_Sum);END;執(zhí)行部分執(zhí)行部分 6 6循環(huán)語句循環(huán)語句WHILEWHILELOOPLOOPEND LOOP END LOOP WHILE LOOP END LOOP;執(zhí)行部分執(zhí)行部分【例】用【例】用WHILEWHILELOOPLOOPEND LOOPEND LOOP語句來實(shí)現(xiàn):語句來實(shí)現(xiàn):

13、SET ServerOutput ON;DECLARE v_Num INTEGER := 1; v_Sum INTEGER := 0;BEGIN WHILE v_Num = 3 LOOP v_Sum := v_Sum + v_Num; dbms_output.put_line(v_Num); IF v_Num 3 THEN dbms_output.put_line( + ); END IF; v_Num := v_Num + 1; END LOOP; dbms_output.put_line( = ); dbms_output.put_line(v_Sum);END;執(zhí)行部分執(zhí)行部分7 7循環(huán)

14、語句循環(huán)語句FORFORININLOOPLOOPEND LOOP END LOOP FOR IN . LOOP END LOOP;執(zhí)行部分執(zhí)行部分【例】用【例】用FORFORININLOOPLOOPEND LOOPEND LOOP語句來實(shí)現(xiàn),代碼如下:語句來實(shí)現(xiàn),代碼如下:SET ServerOutput ON;DECLARE v_Num INTEGER; v_Sum INTEGER := 0;BEGIN FOR v_Num IN 1.3 LOOP v_Sum := v_Sum + v_Num; dbms_output.put_line(v_Num); IF v_Num 3 THEN dbms

15、_output.put_line( + ); END IF; END LOOP; dbms_output.put_line( = ); dbms_output.put_line(v_Sum);END;常用函數(shù)常用函數(shù) p 數(shù)值型函數(shù)數(shù)值型函數(shù) p 字符型函數(shù)字符型函數(shù) p 日期型函數(shù)日期型函數(shù) p 統(tǒng)計(jì)函數(shù)統(tǒng)計(jì)函數(shù) 數(shù)值型函數(shù)數(shù)值型函數(shù)pABSABS函數(shù)返回給定數(shù)字表達(dá)式的絕對值。函數(shù)返回給定數(shù)字表達(dá)式的絕對值?!纠咳绻?jì)算【例】如果要計(jì)算4 4的絕對值:的絕對值:SET ServerOutput ON;BEGIN dbms_output.put_line(ABS(-4);END;數(shù)值型函

16、數(shù)數(shù)值型函數(shù)pCEILCEIL函數(shù)返回大于或等于所給數(shù)字表達(dá)式的最函數(shù)返回大于或等于所給數(shù)字表達(dá)式的最小整數(shù)。小整數(shù)?!纠糠謩e對正數(shù)、負(fù)數(shù)和【例】分別對正數(shù)、負(fù)數(shù)和0 0計(jì)算計(jì)算CEILCEIL:SET ServerOutput ON;BEGIN dbms_output.put_line(CEIL(116.24); dbms_output.put_line(CEIL(-112.75); dbms_output.put_line(CEIL(0);END;數(shù)值型函數(shù)數(shù)值型函數(shù)pFLOORFLOOR函數(shù)返回小于或等于所給數(shù)字表達(dá)式函數(shù)返回小于或等于所給數(shù)字表達(dá)式的最大整數(shù)。的最大整數(shù)?!纠糠謩e對

17、正數(shù)、負(fù)數(shù)和【例】分別對正數(shù)、負(fù)數(shù)和0 0計(jì)算計(jì)算FLOORFLOOR:SET ServerOutput ON;BEGIN dbms_output.put_line(FLOOR(116.24); dbms_output.put_line(FLOOR(-112.75); dbms_output.put_line(FLOOR(0);END;數(shù)值型函數(shù)數(shù)值型函數(shù)p POWER POWER函數(shù)返回給定表達(dá)式乘指定次方的值。函數(shù)返回給定表達(dá)式乘指定次方的值?!纠繄?zhí)行以下命令,計(jì)算【例】執(zhí)行以下命令,計(jì)算1515的的4 4次方:次方:SET ServerOutput ON;BEGIN dbms_outp

18、ut.put_line(POWER(15, 4);END;數(shù)值型函數(shù)數(shù)值型函數(shù)pROUNDROUND函數(shù)返回?cái)?shù)字表達(dá)式并四舍五入為指定的長度或函數(shù)返回?cái)?shù)字表達(dá)式并四舍五入為指定的長度或精度。精度?!纠空垐?zhí)行以下命令,注意觀察長度變化對結(jié)果的影響:【例】請執(zhí)行以下命令,注意觀察長度變化對結(jié)果的影響:SET ServerOutput ON;BEGIN dbms_output.put_line(ROUND(123.456, 2); dbms_output.put_line(ROUND(123.456, 1); dbms_output.put_line(ROUND(123.456, 0); dbms

19、_output.put_line(ROUND(123.456, -1); dbms_output.put_line(ROUND(123.456, -2); dbms_output.put_line(ROUND(123.456, -3);END;字符型函數(shù)字符型函數(shù) p ASCIIASCII函數(shù)返回字符表達(dá)式最左端字符的函數(shù)返回字符表達(dá)式最左端字符的 ASCII ASCII 代碼值。代碼值?!纠繄?zhí)行以下命令,輸出字符【例】執(zhí)行以下命令,輸出字符A A的的ASCIIASCII碼。碼。SET ServerOutput ON;BEGIN dbms_output.put_line(ASCII(ABC)

20、;END;字符型函數(shù)字符型函數(shù) pLENGTHLENGTH函數(shù)返回給定字符串表達(dá)式的字符(而函數(shù)返回給定字符串表達(dá)式的字符(而不是字節(jié))個(gè)數(shù),其中不包含尾隨空格。不是字節(jié))個(gè)數(shù),其中不包含尾隨空格?!纠糠祷亟處熋Q的字符串長度:【例】返回教師名稱的字符串長度: SELECT tname, LENGTH(tname) FROM teacher WHERE tid = 1;字符型函數(shù)字符型函數(shù) pUPPERUPPER函數(shù)返回將小寫字符數(shù)據(jù)轉(zhuǎn)換為大寫的函數(shù)返回將小寫字符數(shù)據(jù)轉(zhuǎn)換為大寫的字符表達(dá)式。字符表達(dá)式。【例】將字符串【例】將字符串 abcabc 轉(zhuǎn)換為大寫字母:轉(zhuǎn)換為大寫字母:SET Ser

21、verOutput ON;BEGIN dbms_output.put_line(UPPER(abc);END;nconcat( )函數(shù) abc+def+xyz 使用該函數(shù)如下: select concat(concat(abc,def),xyz) from dual;select to_number(substr(abcde123,6,3)+5 from dual; 完成123+5的運(yùn)算 to_number(substr(abcde123,length(abcde123)-3+1,3)+5 思考: 假設(shè)字符串尾部數(shù)字字符長度不相同? abcde123 , abcd12,dhf5等,如何提取串尾

22、部的數(shù)值?考慮采用函數(shù)提取數(shù)值 select to_number(substr(abcde123,length(abcde123)-getNcTrail(abcde123)+1,getNcTrail(abcde123)+5 from dual;如何編寫getNcTrail( )函數(shù)?日期型函數(shù)日期型函數(shù) pSYSDATESYSDATE。返回當(dāng)前日期和時(shí)間。返回當(dāng)前日期和時(shí)間?!纠枯敵霎?dāng)前的日期信息:【例】輸出當(dāng)前的日期信息:SET ServerOutput ON;BEGIN dbms_output.put_line(SYSDATE);END;pTO_CHARTO_CHAR。轉(zhuǎn)換日期為字符串。

23、轉(zhuǎn)換日期為字符串?!纠繉?dāng)前日期轉(zhuǎn)換為字符串后再輸出:【例】將當(dāng)前日期轉(zhuǎn)換為字符串后再輸出:SET ServerOutput ON;BEGIN dbms_output.put_line(TO_CHAR(SYSDATE);END;日期型函數(shù)日期型函數(shù) pLAST_DAYLAST_DAY。返回包含日期。返回包含日期d d的月份的最后一天的日期。這個(gè)函數(shù)可以被的月份的最后一天的日期。這個(gè)函數(shù)可以被用來確定當(dāng)前月中還剩下多少天。用來確定當(dāng)前月中還剩下多少天?!纠枯敵霎?dāng)前月份的最后一天:【例】輸出當(dāng)前月份的最后一天:SET ServerOutput ON;BEGIN dbms_output.put_

24、line(LAST_DAY(SYSDATE);END;pMONTHS_BETWEENMONTHS_BETWEEN。返回兩個(gè)日期之間月的數(shù)目。返回兩個(gè)日期之間月的數(shù)目。【例】計(jì)算【例】計(jì)算2008-06-052008-06-05到到2008-10-052008-10-05之間的月份數(shù)目:之間的月份數(shù)目:SET ServerOutput ON;DECLARE date1 VARCHAR2(20) := 2008-06-05; date2 VARCHAR2(20) := 2008-10-05;BEGIN dbms_output.put_line(MONTHS_BETWEEN(TO_DATE(date

25、2,yyyy-mm-dd), TO_DATE(date1, yyyy-mm-dd);END;統(tǒng)計(jì)函數(shù)統(tǒng)計(jì)函數(shù) pCOUNTCOUNT函數(shù)返回組中項(xiàng)目的數(shù)量。函數(shù)返回組中項(xiàng)目的數(shù)量。 【例】統(tǒng)計(jì)表teacher中教師的人數(shù):SELECT COUNT(tname) FROM teacher;pMAXMAX。MAXMAX函數(shù)返回表達(dá)式的最大值。函數(shù)返回表達(dá)式的最大值。 【例】統(tǒng)計(jì)表teacher中最大的教師編號:SELECT MAX(tid) FROM teacher;pMINMIN。MINMIN函數(shù)返回表達(dá)式的最小值。函數(shù)返回表達(dá)式的最小值。 【例】統(tǒng)計(jì)表teacher中最小的教師編號:SELEC

26、T MIN(tid) FROM teacher;函數(shù)函數(shù) pCREATE FUNCTIONCREATE FUNCTION語句來創(chuàng)建函數(shù):語句來創(chuàng)建函數(shù):CREATE OR REPLACE FUNCTION ( ) RETURN IS | AS BEGIN RETURN END ;例:查詢2008年1月1日到2009年4月1日之前出身的學(xué)生信息select * from student where birthdate between to_date(2008-1-1,YYYY-MM-DD) and to_date(2009-4-1,yyyy-mm-dd); 有個(gè)問題!insert into st

27、udent values(1011,李華,男,to_date(2009-4-1 10:23:23,yyyy-mm-dd hh24:mi:ss),);create or replace function todatemax(strDate nvarchar2)return date is Result date; str nvarchar2(100);begin str:=concat(strDate, 23:59:59); Result:=to_date(str,yyyy-mm-dd hh24:mi:ss); return(Result);end todatemax;select * from

28、 student where birthdate between to_date(2008-1-1,YYYY-MM-DD) and todatemax(2009-4-1);.null值結(jié)構(gòu) 在if結(jié)構(gòu)中只有相關(guān)條件為真時(shí),相應(yīng)語句才執(zhí)行,如果條件為false或null時(shí),語句都不執(zhí)行。當(dāng)條件為null時(shí),對程序執(zhí)行的流程有較大的影響。declare v1 number; v2 number; v3 varchar2(7); begin if v1v2 then v3:=no; else v3:=yes; end if;End; 這兩段程序是有區(qū)別的: 例如:v1為1,v2為null則,第一段程

29、序(1null)返回null,if條件不成立,進(jìn)入else,v3為no 第二段程序,同樣也執(zhí)行else,則v3為yes,所以結(jié)果可能不同。解決辦法: 添加對null的檢測。declare v1 number; v2 number; v3 varchar2(7); begin if v1 is null or v2 is null then v3=unknown; else if v1v2 then v3:=no; else v3:=yes; end if;End; 使用使用%TYPE和和%ROWTYPE類型的變量類型的變量 在定義變量時(shí),除了可以使用在定義變量時(shí),除了可以使用OracleOra

30、cle規(guī)定的數(shù)據(jù)類規(guī)定的數(shù)據(jù)類型外,還可以使用型外,還可以使用%TYPE%TYPE、%ROWTYPE%ROWTYPE類型變量。類型變量。l %TYPE%TYPE類型變量類型變量 存儲(chǔ)從數(shù)據(jù)庫列中檢索到的值而創(chuàng)建的。對于使用存儲(chǔ)從數(shù)據(jù)庫列中檢索到的值而創(chuàng)建的。對于使用%TYPE%TYPE創(chuàng)建的變量,其數(shù)據(jù)類型由系統(tǒng)根據(jù)檢索的數(shù)據(jù)創(chuàng)建的變量,其數(shù)據(jù)類型由系統(tǒng)根據(jù)檢索的數(shù)據(jù)庫列的數(shù)據(jù)類型決定。庫列的數(shù)據(jù)類型決定。l %ROWTYPE%ROWTYPE類型的變量類型的變量 一次存儲(chǔ)從數(shù)據(jù)庫檢索的一行數(shù)據(jù)。一次存儲(chǔ)從數(shù)據(jù)庫檢索的一行數(shù)據(jù)。 %TYPE變量變量 當(dāng)使用%type定義變量時(shí),其數(shù)據(jù)類型為指定的

31、列的數(shù)據(jù)類型。 set serveroutput on; declare id student.sid%type; name student.sname%type; gender student.gender%type; birthday student.birthdate%type; begin select sid,sname,gender,birthday into id , name , gender , birthday from student where sid=2; dbms_output.put_line(id|/|name|/|gender|/| birthday); en

32、d; 優(yōu)點(diǎn): (1)用戶不必查看數(shù)據(jù)類型。 (2)當(dāng)數(shù)據(jù)庫結(jié)構(gòu)改變時(shí),用戶不必更改變量類型。%ROWTYPE變量變量 對數(shù)據(jù)庫進(jìn)行查詢時(shí),使用%ROWTYPE變量變量可以存儲(chǔ)查詢的一行數(shù)據(jù)(一個(gè)記錄值)。set serveroutput on; declare row student%rowtype; begin select * into row from student where sid=1; dbms_output.put_line(row.sid); dbms_output.put_line(row.sname); dbms_output.put_line(row.gender);

33、dbms_output.put_line(row.birthdate); end;復(fù)合變量復(fù)合變量 用戶自定義的由多個(gè)值組成的變量。復(fù)合變量可以將不同數(shù)據(jù)類型的多個(gè)值存儲(chǔ)在一個(gè)單元中。 復(fù)合變量有兩類:記錄類型、記錄表類型.記錄類型 定義格式: type record_name is record( field1_name data_type :=default_value, fieldn_name data_type :=default_value); set serveroutput on; declare type stu is record( id number, name varch

34、ar(15), gender nchar(1), birthday date); record_var stu; begin select sid,sname,gender,birthdate into record_var from student where sid=1; dbms_output.put_line(record_var.id|record_); end; 記錄類型相同的變量可以賦值,但類型不同的變量,盡管類型內(nèi)的字段相同,也不能相互賦值。 set serveroutput on declare type stu1 is record( id number,

35、name varchar(15), gender nchar(1), birthday date); type stu2 is record( id number, name varchar(15), gender nchar(1), birthday date); record_var1 stu1; record_var2 stu1; record_var3 stu2; begin select sid,sname,gender,birthdate intorecord_var1 from student where sid=1; record_var2:=record_var1; reco

36、rd_var3:=record_var1; (錯(cuò)誤錯(cuò)誤) end;.記錄表類型 用于存儲(chǔ)多行數(shù)據(jù),相當(dāng)于在內(nèi)存中建立一個(gè)數(shù)據(jù)表。一,什么是PL/SQL表? 首先PL/SQL表和記錄(Record)一樣,都是復(fù)合數(shù)據(jù)類型??梢钥醋鍪且环N用戶自定義數(shù)據(jù)類型。 PL/SQL表由多列單行的標(biāo)量構(gòu)成的臨時(shí)索引表對象。組成類似于一維數(shù)組。區(qū)別和聯(lián)系記錄(Record)的單行多列和物理存儲(chǔ)數(shù)據(jù)的表。Record + PL/SQL表可以進(jìn)行數(shù)據(jù)的多行多列存儲(chǔ)。生命周期在程序塊內(nèi)。 .聲明PL/SQL表類型對象 語法: TYPE PL/SQL表名 IS TABLE OF 可用列類型 INDEX BY BINAR

37、Y_INTEGER; 可用列類型可以為Oracle的數(shù)據(jù)類類型以及用戶自定義類型; 屬性方法: count -返回pl/sql表的總行數(shù); delect -刪除pl/sql表的所有內(nèi)容; delect(行數(shù)) -刪除pl/sql表的指定的行; delect(開始行,結(jié)束行) -刪除pl/sql表的多行; first -返回表的第一個(gè)INDEX; next(行數(shù)) -這個(gè)行數(shù)的下一條的INDEX; last -返回表的最后一個(gè)INDEX;.聲明PL/SQL表類型變量: 語法: PL/SQL表類型變量名 PL/SQL表類型;.數(shù)據(jù)填充和訪問 語法: PL/SQL表類型變量名(索引列值) := 填充

38、聲明類型值; PL/SQL表類型變量名.屬性方法名;Declare Type MyTabType is Table Of VarChar2(10) Index By Binary_Integer; MyTab MyTabType; vN Number(4); Begin MyTab(1) := A; MyTab(2) := B; MyTab(3) := C; vN := MyTab.First; DBMS_OUTPUT.PUT_LINE(First index:| |vN | ); vN := MyTab.Last; DBMS_OUTPUT.PUT_LINE(last index:| |vN)

39、; End;set serveroutput ondeclare type table_stu is table of student%rowtype index by binary_integer; stu table_stu; index_num integer; i integer:=0; begin for vare in (select * from student) Loop stu(i).sid := vare.sid; stu(i).sname:=vare.sname; stu(i).gender:=vare.gender; stu(i).birthdate:=vare.bir

40、thdate; stu(i).email:=vare.email; i:=i+1; end Loop; index_num :=stu.First; For i in 1.stu.count Loop dbms_output.put_line(第|index_num|行數(shù)據(jù):|stu(index_num).sid| /|stu(index_num).sname); index_num:=stu.next(index_num); end Loop; end; set serveroutput onDeclare Type MyTabType is Table Of VarChar2(10) In

41、dex By Binary_Integer; MyTab MyTabType; vN Number(4); Begin MyTab(1) := A; MyTab(2) := B; MyTab(3) := C; vN := MyTab.First; DBMS_OUTPUT.PUT_LINE(原表記錄數(shù)為:| MyTab.count); MyTab.delete(2); DBMS_OUTPUT.PUT_LINE(刪除記錄后記錄數(shù)為:| MyTab.count);MyTab.delete; DBMS_OUTPUT.PUT_LINE(剩余記錄數(shù)為:| MyTab.count);End;刪除記錄表中的記

42、錄數(shù)據(jù)刪除記錄表中的記錄數(shù)據(jù)異常處理異常處理 oracle異常有3種類型: (1)預(yù)定義異常 oracle為用戶提供了大量的在PL/SQL中使用的預(yù)定義異常,不需要用戶定義,由oracle自動(dòng)引發(fā) (2)非預(yù)定義異常 其他標(biāo)準(zhǔn)的oracle錯(cuò)誤,需要用戶在程序中定義,由oracle自動(dòng)引發(fā) (3)自定義異常 用戶自己設(shè)計(jì)的異常,需要用戶顯示地引發(fā)pWHENWHEN語句來定義異常處理:語句來定義異常處理:EXCEPTION WHEN THEN WHEN THEN WHEN OTHERS THEN 預(yù)定義異常預(yù)定義異常 set serveroutput onDECLARE name VARCHAR(40);BEGIN SELECT sname INTO name FROM student WHERE sid = 7;EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(沒有數(shù)據(jù)); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(返回多行匹配的數(shù)據(jù));

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論