第14章PLSQL程序設(shè)計(jì)_第1頁(yè)
第14章PLSQL程序設(shè)計(jì)_第2頁(yè)
第14章PLSQL程序設(shè)計(jì)_第3頁(yè)
第14章PLSQL程序設(shè)計(jì)_第4頁(yè)
第14章PLSQL程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩258頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)1第第1414章章 PL/SQLPL/SQL程序設(shè)計(jì)程序設(shè)計(jì)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)2本章內(nèi)容本章內(nèi)容nPL/SQL概述概述nPL/SQL基礎(chǔ)基礎(chǔ)n控制結(jié)構(gòu)控制結(jié)構(gòu)n游標(biāo)游標(biāo)n異常處理異常處理n存儲(chǔ)子程序存儲(chǔ)子程序n包包n觸發(fā)器觸發(fā)器大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)3本章要求本章要求n掌握掌握PL/SQL程序設(shè)計(jì)基礎(chǔ)知識(shí)程序設(shè)計(jì)基礎(chǔ)知識(shí)n掌握存儲(chǔ)過(guò)程、函數(shù)、包、觸發(fā)器的應(yīng)用掌握存儲(chǔ)過(guò)程、函數(shù)、包、觸發(fā)器的應(yīng)用大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)414.1 PL/SQL14.1 PL/SQL概述概述nPL/SQL特點(diǎn)特點(diǎn)nPL/SQL功能特性功能特性nPL/SQL執(zhí)行過(guò)程與開(kāi)

2、發(fā)工具執(zhí)行過(guò)程與開(kāi)發(fā)工具大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)5為什么需要為什么需要PL/SQLnPL/SQL:針對(duì):針對(duì)ORACLE的編程語(yǔ)言的編程語(yǔ)言nSQL語(yǔ)言的缺點(diǎn):僅限于數(shù)據(jù)庫(kù)的操作,語(yǔ)言的缺點(diǎn):僅限于數(shù)據(jù)庫(kù)的操作,沒(méi)有邏輯控制結(jié)構(gòu)沒(méi)有邏輯控制結(jié)構(gòu)n無(wú)法實(shí)現(xiàn)復(fù)雜的無(wú)法實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、算法數(shù)據(jù)結(jié)構(gòu)、算法,無(wú)法進(jìn)行復(fù),無(wú)法進(jìn)行復(fù)雜的雜的業(yè)務(wù)邏輯業(yè)務(wù)邏輯。n編程語(yǔ)言編程語(yǔ)言+SQL?n高級(jí)語(yǔ)言:高級(jí)語(yǔ)言:C+(Java)+SQLn腳本語(yǔ)言:腳本語(yǔ)言:PHP(ASP)+SQL大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)6“編程語(yǔ)言編程語(yǔ)言+SQL”的缺點(diǎn)的缺點(diǎn)exec(select * from tbMath);

3、for (每條記錄每條記錄) if(女女) exec(update set xx= where id=) ; else if(男男) exec(update set xx= where id=) ; 修改學(xué)生數(shù)學(xué)成績(jī):女生加修改學(xué)生數(shù)學(xué)成績(jī):女生加10分,男生加分,男生加15分。分。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)7客戶(hù)端客戶(hù)端Oracleselect查詢(xún)結(jié)果查詢(xún)結(jié)果更新成功?更新成功?update 1update更新成功?更新成功?update n大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)8普通程序執(zhí)行過(guò)程普通程序執(zhí)行過(guò)程n普通程序執(zhí)行過(guò)程普通程序執(zhí)行過(guò)程n客戶(hù)端通過(guò)網(wǎng)絡(luò)發(fā)送客戶(hù)端通過(guò)網(wǎng)絡(luò)發(fā)送select語(yǔ)句

4、到語(yǔ)句到Oracle,Oracle編編譯、執(zhí)行該語(yǔ)句譯、執(zhí)行該語(yǔ)句nOracle將查詢(xún)結(jié)果網(wǎng)絡(luò)發(fā)送到客戶(hù)端將查詢(xún)結(jié)果網(wǎng)絡(luò)發(fā)送到客戶(hù)端n客戶(hù)端逐條判斷查詢(xún)結(jié)果,逐條發(fā)送客戶(hù)端逐條判斷查詢(xún)結(jié)果,逐條發(fā)送update語(yǔ)句語(yǔ)句nOracle通過(guò)網(wǎng)絡(luò)接收通過(guò)網(wǎng)絡(luò)接收update語(yǔ)句,編譯、執(zhí)行語(yǔ)句,編譯、執(zhí)行n客戶(hù)端客戶(hù)端Oraclen1條條Select+n條條update:編譯、執(zhí)行編譯、執(zhí)行nOracle客戶(hù)端客戶(hù)端:n1條查詢(xún)結(jié)果條查詢(xún)結(jié)果+n條更新結(jié)果:其中,條更新結(jié)果:其中,查詢(xún)結(jié)果數(shù)據(jù)量查詢(xún)結(jié)果數(shù)據(jù)量可能很大,且通常需要可能很大,且通常需要網(wǎng)絡(luò)傳輸網(wǎng)絡(luò)傳輸n普通數(shù)據(jù)庫(kù)程序:普通數(shù)據(jù)庫(kù)程序:程

5、序執(zhí)行效率差程序執(zhí)行效率差大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)9客戶(hù)端客戶(hù)端Oracle成功?成功?PL/SQL大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)10PL/SQL執(zhí)行過(guò)程執(zhí)行過(guò)程nPL/SQL程序:程序:n只進(jìn)行一次網(wǎng)絡(luò)傳輸只進(jìn)行一次網(wǎng)絡(luò)傳輸n在在ORACLE端編譯;端編譯;n執(zhí)行過(guò)程在服務(wù)器端進(jìn)行。執(zhí)行過(guò)程在服務(wù)器端進(jìn)行。程序執(zhí)行過(guò)程中:程序執(zhí)行過(guò)程中:n不需要網(wǎng)絡(luò)傳輸不需要網(wǎng)絡(luò)傳輸n不占用客戶(hù)端資源:不占用客戶(hù)端資源:CPU、內(nèi)存、內(nèi)存n編譯:編譯:PL/SQL程序分兩類(lèi)程序分兩類(lèi)n普通程序:普通程序:一次編譯一次編譯n存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程:預(yù)編譯預(yù)編譯,執(zhí)行時(shí)不需要編譯,執(zhí)行時(shí)不需要編譯大型數(shù)據(jù)庫(kù)系統(tǒng)大型

6、數(shù)據(jù)庫(kù)系統(tǒng)1114.1.1 PL/SQL14.1.1 PL/SQL特點(diǎn)特點(diǎn)n服務(wù)器端程序(存儲(chǔ)過(guò)程):服務(wù)器端程序(存儲(chǔ)過(guò)程):永久駐留在永久駐留在服務(wù)器端服務(wù)器端n減小網(wǎng)絡(luò)流量,提高應(yīng)用程序的運(yùn)行性能。減小網(wǎng)絡(luò)流量,提高應(yīng)用程序的運(yùn)行性能。n可移植性好:可移植性好:只限于只限于Oraclen專(zhuān)門(mén)針對(duì)專(zhuān)門(mén)針對(duì)ORACLE的程序設(shè)計(jì)語(yǔ)言的程序設(shè)計(jì)語(yǔ)言n結(jié)構(gòu)化的程序設(shè)計(jì)風(fēng)格結(jié)構(gòu)化的程序設(shè)計(jì)風(fēng)格n與與SQL語(yǔ)言緊密集成。語(yǔ)言緊密集成。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)1214.1.2 PL/SQL14.1.2 PL/SQL功能特性功能特性n語(yǔ)法:語(yǔ)法:n語(yǔ)句塊結(jié)構(gòu)語(yǔ)句塊結(jié)構(gòu)n異常處理異常處理n變量和類(lèi)型變

7、量和類(lèi)型n條件語(yǔ)句條件語(yǔ)句n循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)n游標(biāo)游標(biāo)n過(guò)程過(guò)程/函數(shù)函數(shù)包包n觸發(fā)器觸發(fā)器大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)1314.1.3 PL/SQL14.1.3 PL/SQL執(zhí)行過(guò)程與開(kāi)發(fā)工具執(zhí)行過(guò)程與開(kāi)發(fā)工具PL/SQL塊塊SQL語(yǔ)句語(yǔ)句客戶(hù)端應(yīng)用程序客戶(hù)端應(yīng)用程序PL/SQL引擎引擎數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器過(guò)程化語(yǔ)句執(zhí)行器過(guò)程化語(yǔ)句執(zhí)行器SQL執(zhí)行器執(zhí)行器塊中塊中SQL語(yǔ)句語(yǔ)句nPL/SQL執(zhí)行過(guò)程執(zhí)行過(guò)程 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)14nPL/SQL開(kāi)發(fā)工具開(kāi)發(fā)工具nSQL *PLUSnProcedure BuildernOracle Form、Oracle ReportsnPL/S

8、QL Developer大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)1514.2.1 PL/SQL14.2.1 PL/SQL程序結(jié)構(gòu)程序結(jié)構(gòu)nPL/SQL塊的組成塊的組成nPL/SQL塊分類(lèi)塊分類(lèi)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)16nPL/SQL語(yǔ)言以程序塊為單位。語(yǔ)言以程序塊為單位。 n塊可以是一個(gè)塊可以是一個(gè)獨(dú)立程序,獨(dú)立程序,也可以也可以嵌入其他塊嵌入其他塊nPL/SQL塊的組成塊的組成n一個(gè)基本的一個(gè)基本的PL/SQL塊由塊由3部分組成:部分組成:n聲明(聲明(DECLARE)n可執(zhí)行部分可執(zhí)行部分(BEGIN)n異常處理部分異常處理部分EXCEPTION)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)17示例示例1:完整

9、的:完整的PL/SQL塊塊DECLARE v_ename VARCHAR2(10);BEGIN SELECT ename INTO v_ename FROM emp WHERE empno=7844; DBMS_OUTPUT.PUT_LINE(v_ename);EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(There is not such an employee);END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)18n聲明部分:聲明部分:關(guān)鍵字關(guān)鍵字DECLARE開(kāi)始,開(kāi)始,BEGIN結(jié)束結(jié)束n聲明聲明變量變量、常量、數(shù)據(jù)、常量、數(shù)據(jù)類(lèi)型類(lèi)

10、型、游標(biāo)、游標(biāo)n異常處理異常處理名稱(chēng)、名稱(chēng)、局部子程序局部子程序定義。定義。 n可執(zhí)行部分:可執(zhí)行部分:關(guān)鍵字關(guān)鍵字BEGIN開(kāi)始,開(kāi)始,EXCEPTION或或END結(jié)束結(jié)束n實(shí)現(xiàn)塊的功能:變量賦值、流程控制、數(shù)據(jù)查詢(xún)、數(shù)據(jù)實(shí)現(xiàn)塊的功能:變量賦值、流程控制、數(shù)據(jù)查詢(xún)、數(shù)據(jù)操縱、數(shù)據(jù)定義、事務(wù)控制、游標(biāo)處理等。操縱、數(shù)據(jù)定義、事務(wù)控制、游標(biāo)處理等。n異常處理部分:異常處理部分:關(guān)鍵字關(guān)鍵字EXCEPTION開(kāi)始,開(kāi)始,END結(jié)束。結(jié)束。n處理塊執(zhí)行過(guò)程中產(chǎn)生的處理塊執(zhí)行過(guò)程中產(chǎn)生的異常異常。 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)19n注意:注意:n執(zhí)行部分是必需的,而執(zhí)行部分是必需的,而聲明部分和異常部

11、分是聲明部分和異常部分是可選的可選的;n所有的所有的PL/SQL塊都是以塊都是以“END;”結(jié)束結(jié)束 n在一個(gè)塊的在一個(gè)塊的執(zhí)行部分或異常處理部分執(zhí)行部分或異常處理部分,可以,可以嵌嵌套套其他其他PL/SQL塊;塊;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)20示例示例2:只包含執(zhí)行部分的:只包含執(zhí)行部分的PL/SQL塊塊BEGIN DBMS_OUTPUT.PUT_LINE(hello world);END;n在在SQL Plus*環(huán)境下環(huán)境下SQLset SERVEROUTPUT ONn可以輸出可以輸出漢字漢字大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)21示例示例1:包含子塊的:包含子塊的PL/SQL塊塊DECLARE

12、 v_sal NUMBER(6,2); v_deptno NUMBER(2);BEGIN BEGIN SELECT deptno INTO v_deptno FROM emp WHERE empno=7844; END; SELECT avg(sal) INTO v_sal FROM emp WHERE deptno=v_deptno; DBMS_OUTPUT.PUT_LINE(v_sal);END;子塊也可以子塊也可以包含包含完整的完整的三部分三部分大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)22nPL/SQL程序分類(lèi)程序分類(lèi)n匿名塊:匿名塊:只執(zhí)行一次只執(zhí)行一次的程序的程序n命名塊:命名塊:存儲(chǔ)在服務(wù)器端

13、的存儲(chǔ)在服務(wù)器端的程序程序n函數(shù)函數(shù)n過(guò)程過(guò)程n包包n觸發(fā)器:觸發(fā)器:自動(dòng)執(zhí)行(不可控制)自動(dòng)執(zhí)行(不可控制)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)23例:命名塊例:命名塊CREATE OR REPLACE PROCEDURE showavgsal(p_deptno NUMBER)IS v_sal NUMBER(6,2);BEGIN SELECT avg(sal) INTO v_sal FROM emp WHERE deptno=p_deptno; DBMS_OUTPUT.PUT_LINE(v_sal);END showavgsal; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)24可以用可以用CREATE OR RE

14、PLACE的對(duì)象的對(duì)象n可以:可以:nFUNCTION、PROCEDURE、PACKAGEnTYPEnSYNONYMnTRIGGERnVIEWn不能:不能:nTABLEnSEQUENCE大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)25.2詞法單元詞法單元n字符集字符集n標(biāo)識(shí)符標(biāo)識(shí)符n分隔符分隔符n常量值常量值n注釋注釋大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)26n字符集字符集n大小寫(xiě)字母:大小寫(xiě)字母:AZ,azn數(shù)字:數(shù)字:09n空白:制表符、空格和回車(chē)空白:制表符、空格和回車(chē)n數(shù)字符號(hào):數(shù)字符號(hào):+ - * / =n標(biāo)點(diǎn)符號(hào):標(biāo)點(diǎn)符號(hào): ! # $ % &* ( ) _ | ? ; :, .

15、 “ 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)27n標(biāo)識(shí)符標(biāo)識(shí)符n標(biāo)識(shí)符必須標(biāo)識(shí)符必須以字母開(kāi)頭以字母開(kāi)頭,后邊可以跟字母、數(shù),后邊可以跟字母、數(shù)字、字、貨幣符號(hào)、下劃線和貨幣符號(hào)、下劃線和”#” n標(biāo)識(shí)符的標(biāo)識(shí)符的最大長(zhǎng)度為最大長(zhǎng)度為30字符字符,并且所有字符,并且所有字符都是有效的。都是有效的。n合法:合法:X v_studentID TempVarn非法:非法:X+y _tempn標(biāo)示符可以是中文:標(biāo)示符可以是中文:不推薦不推薦大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)28n+n-n*n/n=n:=nn=nn!=n=n=n(n)n/*n*/nn%n;n:n.nn“n.nn|n=n*n-p分隔符分隔符大型數(shù)據(jù)庫(kù)系統(tǒng)

16、大型數(shù)據(jù)庫(kù)系統(tǒng)29n常量值常量值n字符型常量字符型常量n數(shù)字型常量數(shù)字型常量 n布爾型常量:布爾型常量:TURE、FALSE、NULLn日期型常量日期型常量大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)3014.2.314.2.3數(shù)據(jù)類(lèi)型:變量、常量數(shù)據(jù)類(lèi)型:變量、常量n數(shù)字類(lèi)型數(shù)字類(lèi)型n字符類(lèi)型字符類(lèi)型n日期日期/區(qū)間類(lèi)型區(qū)間類(lèi)型n行標(biāo)識(shí)類(lèi)型行標(biāo)識(shí)類(lèi)型n布爾類(lèi)型布爾類(lèi)型n原始類(lèi)型原始類(lèi)型nLOB類(lèi)型類(lèi)型n記錄類(lèi)型記錄類(lèi)型n集合類(lèi)型集合類(lèi)型大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)PL/SQL程序注意事項(xiàng)程序注意事項(xiàng)n程序中既可以出現(xiàn)程序中既可以出現(xiàn)表名、字段名表名、字段名,也可以,也可以出現(xiàn)出現(xiàn)變量名變量名;n表名、字段名

17、只能出現(xiàn)在表名、字段名只能出現(xiàn)在SQL語(yǔ)句中語(yǔ)句中;n變量名變量名既可以出現(xiàn)在既可以出現(xiàn)在SQL中,也可以出現(xiàn)中,也可以出現(xiàn)在在程序的控制語(yǔ)句程序的控制語(yǔ)句中;中;n程序不能直接處理表或字段數(shù)據(jù)程序不能直接處理表或字段數(shù)據(jù)n如果程序的語(yǔ)句需要使用表中的數(shù)據(jù)或查如果程序的語(yǔ)句需要使用表中的數(shù)據(jù)或查詢(xún)的結(jié)果,則需要詢(xún)的結(jié)果,則需要先將數(shù)據(jù)放入變量中先將數(shù)據(jù)放入變量中,再進(jìn)行程序的處理過(guò)程。再進(jìn)行程序的處理過(guò)程。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)32基本數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型分類(lèi)分類(lèi)數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型(P122,P266)數(shù)字類(lèi)型數(shù)字類(lèi)型NUMBER、BINARY_NUMBER(32位有符位有符號(hào)二進(jìn)制)、號(hào)

18、二進(jìn)制)、 PLS_NUMBER字符類(lèi)型字符類(lèi)型VARCHAR2、CHAR、LONG、NCHAR、NVARCHAR(P267:最大長(zhǎng)度變化了):最大長(zhǎng)度變化了)日期日期/區(qū)間類(lèi)型區(qū)間類(lèi)型 DATE(秒)(秒)、TIMESTAMP(秒帶小數(shù))、(秒帶小數(shù))、INTERVAL(時(shí)間間隔)(時(shí)間間隔)行標(biāo)識(shí)類(lèi)型行標(biāo)識(shí)類(lèi)型ROWID、UROWID布爾類(lèi)型布爾類(lèi)型BOOLEAN(TRUE、FALSE、NULL)原始類(lèi)型原始類(lèi)型RAW、LONG RAWLOB類(lèi)型類(lèi)型CLOB、BLOB、NCLOB、BFILE記錄記錄(結(jié)構(gòu)結(jié)構(gòu))類(lèi)型類(lèi)型RECORD集合集合(數(shù)組數(shù)組)類(lèi)型類(lèi)型TABLE、VARRAY大型數(shù)據(jù)

19、庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)33n記錄類(lèi)型的定義記錄類(lèi)型的定義TYPE record_type IS RECORD(field1 datatype1 NOT NULLDEFAULT|:=expr1,field2 datatype2 NOT NULL DEFAULT|:=expr2,fieldn datatypen NOT NULL DEFAULT|:=exprn); 記錄類(lèi)型記錄類(lèi)型大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)34記錄類(lèi)型結(jié)構(gòu)類(lèi)型記錄類(lèi)型結(jié)構(gòu)類(lèi)型TYPE t_emp IS RECORD( empno NUMBER(4), ename CHAR(10), sal NUMBER(6,2);v_emp t_

20、emp;v1_emp t_emp;1)相同類(lèi)型的記錄可以直接賦值:相同類(lèi)型的記錄可以直接賦值:v1_emp:=v_emp;2)記錄類(lèi)型是局部的:記錄類(lèi)型是局部的:只在定義的塊中有效只在定義的塊中有效大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)C語(yǔ)言語(yǔ)言struct t_emp short empno; char ename10; int NUMBER;struct t_emp v_emp;struct t_emp v1_emp;v1_emp=v_emp;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)36n索引表類(lèi)型(局部:索引表類(lèi)型(局部:塊中有效塊中有效)nTYPE emp_table IS TABLE OF CHAR(10

21、) INDEX BY BINARY_INTEGER;n嵌套表類(lèi)型(全局:嵌套表類(lèi)型(全局:全部數(shù)據(jù)庫(kù)全部數(shù)據(jù)庫(kù))nTYPE nested_table IS TABLE OF CHAR(10);n可變數(shù)組類(lèi)型(全局)可變數(shù)組類(lèi)型(全局)nTYPE varry_table IS VARRY (2) OF CHAR(10);集合類(lèi)型(數(shù)組)集合類(lèi)型(數(shù)組)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)37n索引表(索引表(hash表,散列數(shù)組)表,散列數(shù)組)emp_table vemps;vemps(100)=a;vemps(1)=b; n嵌套表(變長(zhǎng)數(shù)組)嵌套表(變長(zhǎng)數(shù)組)nested_table vemps;ve

22、mps(1)=a;vemps(2)=b; vemps(4)=c;n可變數(shù)組(定長(zhǎng)數(shù)組)可變數(shù)組(定長(zhǎng)數(shù)組)varry_table vemps;vemps(1)=a;vemps(2)=b;vemps(3)=c;報(bào)錯(cuò)!報(bào)錯(cuò)!報(bào)錯(cuò)!報(bào)錯(cuò)!大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)38PL/SQL vs. 編程語(yǔ)言的數(shù)組編程語(yǔ)言的數(shù)組n集合類(lèi)型:集合類(lèi)型:n無(wú)需無(wú)需事先分配空間,直接使用事先分配空間,直接使用n可變表和嵌套表必須可變表和嵌套表必須依序使用各下標(biāo)依序使用各下標(biāo);n編譯型語(yǔ)言的編譯型語(yǔ)言的靜態(tài)數(shù)組:靜態(tài)數(shù)組:n事先分配事先分配;n無(wú)序無(wú)序使用各下標(biāo)使用各下標(biāo)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)399、%TYPE

23、與與%ROWTYPEDECLARE v_sal emp.sal%TYPE; v_emp emp%ROWTYPE;BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=7844; SELECT * INTO v_emp FROM emp WHERE empno=7900; DBMS_OUTPUT.PUT_LINE(v_sal); DBMS_OUTPUT.PUT_LINE(v_emp.ename |v_emp.sal);END;利用利用已有表已有表或或已有字段已有字段定義數(shù)據(jù)類(lèi)型定義數(shù)據(jù)類(lèi)型大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)40記錄類(lèi)型的索引表(結(jié)構(gòu)數(shù)組)記錄

24、類(lèi)型的索引表(結(jié)構(gòu)數(shù)組)DECLARE TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; emp_table emp_table_type;BEGIN SELECT * INTO emp_table(1) FROM emp WHERE empno = &no; dbms_output.putline(雇員姓名雇員姓名| emp_table(1).ename); dbms_output.putline(雇員工資雇員工資|emp_table(1).sal);END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)4114.

25、2.4 14.2.4 語(yǔ)法:變量與常量語(yǔ)法:變量與常量n變量與常量的定義變量與常量的定義n變量的作用域變量的作用域大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)42變量聲明變量、常量與非空變量、常量與非空n變量定義的一般格式:變量定義的一般格式:n CONSTANT NOT NULL DEFAULT|:= ;n說(shuō)明說(shuō)明n每行只能定義一個(gè)每行只能定義一個(gè)標(biāo)識(shí)符。標(biāo)識(shí)符。n如果加上關(guān)鍵字如果加上關(guān)鍵字CONSTANT,則表示所定義的標(biāo)識(shí)符,則表示所定義的標(biāo)識(shí)符為一個(gè)常量,必須為它賦初值。為一個(gè)常量,必須為它賦初值。n如果定義的標(biāo)識(shí)符不能為空,則必須加上關(guān)鍵字如果定義的標(biāo)識(shí)符不能為空,則必須加上關(guān)鍵字NOT NULL

26、,并賦初值。,并賦初值。n為標(biāo)識(shí)符賦值時(shí),使用為標(biāo)識(shí)符賦值時(shí),使用賦值符號(hào)賦值符號(hào)“:=”,默認(rèn)值為空。,默認(rèn)值為空。n“=” ?大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)43DECLARE v1 NUMBER(4); v2 NUMBER(4) NOT NULL :=10; v3 CONSTANT NUMBER(4) DEFAULT 100;BEGIN IF v1 IS NULL THEN DBMS_OUTPUT.PUT_LINE(V1 IS NULL!); END IF; DBMS_OUTPUT.PUT_LINE(v2| |v3);END; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)44變量的作用域變量的作用域n變量有

27、效范圍:變量有效范圍:從聲明開(kāi)始,直到塊結(jié)束從聲明開(kāi)始,直到塊結(jié)束n嵌套塊:嵌套塊:n內(nèi)部塊內(nèi)部塊中聲明的變量是局部的,只能在內(nèi)部塊中聲明的變量是局部的,只能在內(nèi)部塊中引用中引用n外部塊外部塊中聲明的變量中聲明的變量既可以既可以在外部塊中引用,在外部塊中引用,也可以也可以在內(nèi)部塊中引用。在內(nèi)部塊中引用。n允許內(nèi)部塊與外部塊允許內(nèi)部塊與外部塊定義同名變量定義同名變量n在內(nèi)部塊中引用外部塊的全局變量時(shí),需要在內(nèi)部塊中引用外部塊的全局變量時(shí),需要使使用外部塊名進(jìn)行標(biāo)識(shí)用外部塊名進(jìn)行標(biāo)識(shí)。 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)45DECLARE v_ename CHAR(15); v_outer NUMBER

28、(5);BEGIN v_outer :=10; DECLARE v_ename CHAR(20); v_inner DATE; BEGIN v_inner:=sysdate; v_ename:=INNER V_ENAME; OUTER.v_ename:=OUTER V_ENAME; END; DBMS_OUTPUT.PUT_LINE(v_ename);END; 變量作用域變量作用域是否在作是否在作用域?用域?大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)4614.2.514.2.5編譯指示編譯指示n編譯指示編譯指示(編譯開(kāi)關(guān))是(編譯開(kāi)關(guān))是對(duì)編譯器發(fā)出的對(duì)編譯器發(fā)出的命令,與程序流程沒(méi)有直接關(guān)系命令,與程序流

29、程沒(méi)有直接關(guān)系。n關(guān)鍵字:關(guān)鍵字:PRAGMAnPL/SQL提供以下四種編譯指示:提供以下四種編譯指示:nEXCEPTION_INITn告訴編譯程序?qū)⒁粋€(gè)特定的錯(cuò)誤號(hào)與程序中所聲明告訴編譯程序?qū)⒁粋€(gè)特定的錯(cuò)誤號(hào)與程序中所聲明的異常標(biāo)識(shí)符關(guān)聯(lián)起來(lái)。的異常標(biāo)識(shí)符關(guān)聯(lián)起來(lái)。 nRESTRICT_REFERENCESn告訴編譯程序打包程序的純度,即對(duì)函數(shù)中可以使告訴編譯程序打包程序的純度,即對(duì)函數(shù)中可以使用的用的SQL語(yǔ)句和包變量進(jìn)行限制。語(yǔ)句和包變量進(jìn)行限制。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)47nSERIALLY_REUSEABLEn告訴告訴PL/SQL運(yùn)行時(shí)引擎,在數(shù)據(jù)引用之間不要保運(yùn)行時(shí)引擎,在數(shù)據(jù)

30、引用之間不要保持包級(jí)數(shù)據(jù)。持包級(jí)數(shù)據(jù)。nAUTONOMOUS_TRANSACTIONn告訴編譯程序,該程序塊為自治事務(wù),即該事務(wù)的告訴編譯程序,該程序塊為自治事務(wù),即該事務(wù)的提交和回滾是獨(dú)立進(jìn)行的。提交和回滾是獨(dú)立進(jìn)行的。 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)4814.2.6 PL/SQL14.2.6 PL/SQL中中SQLSQL語(yǔ)句語(yǔ)句n在在PL/SQL中中可以執(zhí)行的可以執(zhí)行的SQL語(yǔ)句語(yǔ)句包括包括nSELECT nDML(UPDATE、DELETE、INSERT)n事務(wù)控制語(yǔ)句(事務(wù)控制語(yǔ)句(COMMIT、ROLLBACK、SAVEPOINT)n注意:注意:nDDL語(yǔ)句不可以直接(獨(dú)立)使用語(yǔ)句不

31、可以直接(獨(dú)立)使用nSELECT可以直接(獨(dú)立)出現(xiàn),但必須改變可以直接(獨(dú)立)出現(xiàn),但必須改變形式形式大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)49n沒(méi)有沒(méi)有INTO的的SELECT語(yǔ)句語(yǔ)句不能直接出現(xiàn)。不能直接出現(xiàn)。nINTO后的變量用于接收查詢(xún)的結(jié)果后的變量用于接收查詢(xún)的結(jié)果n變量個(gè)數(shù)、順序要與查詢(xún)的目標(biāo)數(shù)據(jù)相匹配變量個(gè)數(shù)、順序要與查詢(xún)的目標(biāo)數(shù)據(jù)相匹配n可以是可以是記錄類(lèi)型記錄類(lèi)型的變量。的變量。n查詢(xún)結(jié)果必須是一行數(shù)據(jù)查詢(xún)結(jié)果必須是一行數(shù)據(jù)n如果沒(méi)有查詢(xún)到任何數(shù)據(jù),則會(huì)產(chǎn)生如果沒(méi)有查詢(xún)到任何數(shù)據(jù),則會(huì)產(chǎn)生NO_DATA_FOUND異常異常n如果查詢(xún)到多個(gè)記錄,則會(huì)產(chǎn)生如果查詢(xún)到多個(gè)記錄,則會(huì)產(chǎn)生T

32、OO_MANY_ROW異常。異常。SELECT. INTO大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)50BEGIN SELECT * FROM empWHERE ename=SMITH;END; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)51DECLARE v_emp emp%ROWTYPE; v_ename emp.ename%type; v_sal emp.sal%type;BEGIN SELECT * INTO v_emp FROM empWHERE ename=SMITH;DBMS_OUTPUT.PUT_LINE(v_emp.empno| |v_emp.sal); SELECT ename,sal INTO v_

33、ename,v_sal FROM emp WHERE empno=7900; DBMS_OUTPUT.PUT_LINE(v_ename| |v_sal);END; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)52注意:注意:n“|”運(yùn)算符的兩邊:運(yùn)算符的兩邊:n允許不同類(lèi)型的數(shù)據(jù)允許不同類(lèi)型的數(shù)據(jù)(數(shù)值、字符串。)(數(shù)值、字符串。)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)53nPL/SQL中,中,DML語(yǔ)句語(yǔ)句允許使用變量允許使用變量。n 示例示例DECLARE v_empno emp.empno%TYPE :=7500;BEGIN INSERT INTO emp(empno,ename,sal,deptno) VALU

34、ES(v_empno,JOAN,2300,20); UPDATE emp SET sal=sal+100 WHERE empno=v_empno; DELETE FROM emp WHERE empno=v_empno;END; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)54n標(biāo)識(shí)符的區(qū)分標(biāo)識(shí)符的區(qū)分:變量名變量名還是還是列名?列名?n首先查看首先查看是否存在同名列是否存在同名列,如存在則標(biāo)識(shí)符被,如存在則標(biāo)識(shí)符被解釋為解釋為列名列名n否則,該標(biāo)識(shí)符被認(rèn)為是否則,該標(biāo)識(shí)符被認(rèn)為是語(yǔ)句塊的變量語(yǔ)句塊的變量。程序的程序的SQL語(yǔ)句中標(biāo)識(shí)符的區(qū)分語(yǔ)句中標(biāo)識(shí)符的區(qū)分declare v_ename emp.ename

35、%TYPE:=SMITH; sal number;begin SELECT sal INTO sal FROM emp WHERE ename=v_ename; DBMS_OUTPUT.PUT_LINE(sal);end;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)55SELECT sal INTO v_sal FROM empWHERE ename=v_ename;n長(zhǎng)度不同的字符串比較長(zhǎng)度不同的字符串比較n填充比較填充比較:在短字符串后添加空格,使兩個(gè)字符串達(dá)到相:在短字符串后添加空格,使兩個(gè)字符串達(dá)到相同長(zhǎng)度,然后再進(jìn)行比較。同長(zhǎng)度,然后再進(jìn)行比較。nABCABC n非填充比較非填充比較:逐字符比較:逐

36、字符比較ASCII碼,碼,首先結(jié)束的小首先結(jié)束的小nABCABC n使用何種方式比較字符串:使用何種方式比較字符串:n對(duì)對(duì)定長(zhǎng)的字符串定長(zhǎng)的字符串(CHAR類(lèi)型、字符串常量)采用類(lèi)型、字符串常量)采用填充比填充比較:較:n如果比較的字符串中有一個(gè)是如果比較的字符串中有一個(gè)是變長(zhǎng)字符串變長(zhǎng)字符串(VARCHAR2類(lèi)類(lèi)型),則采用型),則采用非填充比較非填充比較: WHERE子句的變化(一)子句的變化(一)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)56n表定義:表定義:ename VARCHAR2(10);-ABCename CHAR(15);-ABCnPL/SQL程序程序v_ename CHAR(10):=A

37、BC ;SELECT sal INTO v_sal FROM empWHERE ename=v_ename;WHERE子句的變化(二)子句的變化(二)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)57n如果要查詢(xún)?nèi)绻樵?xún)當(dāng)前當(dāng)前DML語(yǔ)句操作的記錄的語(yǔ)句操作的記錄的信息信息,可以在,可以在DML語(yǔ)句末尾使用語(yǔ)句末尾使用RETURNING語(yǔ)句返回該記錄的信息。語(yǔ)句返回該記錄的信息。nRETURNING語(yǔ)句的基本語(yǔ)法:語(yǔ)句的基本語(yǔ)法:nRETURNING select_list_item INTO variable_list|record_variable; RETURNING子句子句大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)

38、58DECLARE v_sal emp.sal%TYPE;BEGIN UPDATE emp SET sal=sal+100 WHERE empno=7844; SELECT sal INTO v_sal FROM emp WHERE empno=7844;DBMS_OUTPUT.PUT_LINE(v_sal);END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)59DECLARE v_sal emp.sal%TYPE;BEGIN UPDATE emp SET sal=sal+100 WHERE empno=7844 RETURNING sal INTO v_sal; DBMS_OUTPUT.PUT_LINE(

39、v_sal);END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)6014.3 14.3 控制結(jié)構(gòu)控制結(jié)構(gòu) n選擇結(jié)構(gòu)選擇結(jié)構(gòu)n循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)n跳轉(zhuǎn)結(jié)構(gòu)跳轉(zhuǎn)結(jié)構(gòu)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)6.1選擇結(jié)構(gòu)選擇結(jié)構(gòu)nIF語(yǔ)句語(yǔ)句IF condition1 THEN statements1;ELSIF condition2 THEN statements2;ELSE else_statements;END IF; n注意注意n條件是一個(gè)布爾型變量或表達(dá)式,取值只能條件是一個(gè)布爾型變量或表達(dá)式,取值只能是是TRUE,F(xiàn)ALSE,NULL。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)62n例如,例如,輸入一個(gè)員

40、工號(hào)輸入一個(gè)員工號(hào),修改該員工的工,修改該員工的工資,如果該員工為資,如果該員工為10號(hào)部門(mén),工資增加號(hào)部門(mén),工資增加100;若為;若為20號(hào)部門(mén),工資增加號(hào)部門(mén),工資增加150;若;若為為30號(hào)部門(mén),工資增加號(hào)部門(mén),工資增加200;否則增加;否則增加300。 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)63DECLARE v_deptno emp.deptno%type; v_increment NUMBER(4); v_empno emp.empno%type;BEGIN v_empno:=&x; SELECT deptno INTO v_deptno FROM emp WHERE empno=v

41、_empno; IF v_deptno=10 THEN v_increment:=100; ELSIF v_deptno=20 THEN v_increment:=150; ELSIF v_deptno=30 THEN v_increment:=200; ELSE v_increment:=300; END IF; UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno;END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)64等值比較的等值比較的CASECASE語(yǔ)句語(yǔ)句n基本語(yǔ)法基本語(yǔ)法nCASE test_valuen WHEN value1 THEN

42、statements1;n WHEN value2 THEN statements2;n n WHEN valuen THEN statementsn;n ELSE else_ statements;nEND CASE; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)65DECLARE v_deptno emp.deptno%type; v_increment NUMBER(4); v_empno emp.empno%type;BEGIN v_empno:=&x; SELECT deptno INTO v_deptno FROM emp WHERE empno=v_empno; CASE v_deptn

43、o WHEN 10 THEN v_increment:=100; WHEN 20 THEN v_increment:=150; WHEN 30 THEN v_increment:=200; ELSE v_increment:=300; END CASE; UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno; END; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)66搜索式搜索式CASECASE語(yǔ)句語(yǔ)句n基本語(yǔ)法基本語(yǔ)法nCASEn WHEN condition1 THEN statements1;n WHEN condition2 THEN state

44、ments2;n n WHEN conditionn THEN statementsn;n ELSE else_statements;nEND CASE;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)67n根據(jù)根據(jù)輸入的員工號(hào)輸入的員工號(hào),修改該員工工資。如,修改該員工工資。如果該員工工資低于果該員工工資低于1000,則工資增加,則工資增加200;如果工資在如果工資在1000-2000之間,則增加之間,則增加150;如果工資在如果工資在2000-3000之間,則增加之間,則增加100;否則增加否則增加50。 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)68DECLARE v_sal emp.sal%type; v_increm

45、ent NUMBER(4); v_empno emp.empno%type;BEGIN v_empno:=&x; SELECT sal INTO v_sal FROM emp WHERE empno=v_empno; CASE WHEN v_sal1000 THEN v_increment:=200; WHEN v_sal2000 THEN v_increment:=150; WHEN v_sal 50; END LOOP;END; 循環(huán)變量循環(huán)變量大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)76WHILEWHILE循環(huán)循環(huán)n基本語(yǔ)法基本語(yǔ)法 WHILE condition LOOP sequence

46、_of_statement; END LOOP; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)77n利用利用WHILE循環(huán)向循環(huán)向temp_table表中插入表中插入50條條記錄。程序?yàn)椋河涗?。程序?yàn)椋?DECLARE v_counter BINARY_INTEGER :=1;BEGIN WHILE v_counter = 50 LOOP INSERT INTO temp_table VALUES (v_counter, Loop index); v_counter := v_counter + 1; END LOOP;END; 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)78FORFOR循環(huán)循環(huán)n基本語(yǔ)法基本語(yǔ)法 FOR

47、loop_counter IN REVERSE low_bound . high_bound LOOP sequence_of_statement; END LOOP;n注意:注意:n循環(huán)變量無(wú)需顯式定義循環(huán)變量無(wú)需顯式定義,系統(tǒng)隱含地將它聲明為,系統(tǒng)隱含地將它聲明為BINARY_INTEGER類(lèi)型類(lèi)型;n循環(huán)變量只能在循環(huán)體中使用循環(huán)變量只能在循環(huán)體中使用,不能在循環(huán)體外使用。,不能在循環(huán)體外使用。n系統(tǒng)默認(rèn)時(shí),循環(huán)變量從下界往上界系統(tǒng)默認(rèn)時(shí),循環(huán)變量從下界往上界遞增計(jì)數(shù)遞增計(jì)數(shù)n如果使用如果使用REVERSE關(guān)鍵字,則循環(huán)變量從上界向下界關(guān)鍵字,則循環(huán)變量從上界向下界遞減計(jì)數(shù)遞減計(jì)數(shù);大型

48、數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)79n例如,利用例如,利用FOR循環(huán)向循環(huán)向temp_table表中表中插入插入50條記錄。程序?yàn)椋簵l記錄。程序?yàn)椋築EGIN FOR v_counter IN 1.50 LOOP INSERT INTO temp_table VALUES(v_counter, Loop Index); END LOOP;END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)8014.3.314.3.3跳轉(zhuǎn)結(jié)構(gòu)跳轉(zhuǎn)結(jié)構(gòu)n語(yǔ)法格式:語(yǔ)法格式:GOTO 標(biāo)號(hào);標(biāo)號(hào);n說(shuō)明:說(shuō)明:n塊內(nèi)可以跳轉(zhuǎn),內(nèi)層塊可以跳到外層塊,但塊內(nèi)可以跳轉(zhuǎn),內(nèi)層塊可以跳到外層塊,但外層塊不外層塊不能跳到內(nèi)層能跳到內(nèi)層。n不能跳入不能

49、跳入:IF語(yǔ)句、循環(huán)體、子程序的內(nèi)部。語(yǔ)句、循環(huán)體、子程序的內(nèi)部。n由于由于goto語(yǔ)句的缺點(diǎn),建議盡量少用甚至不用語(yǔ)句的缺點(diǎn),建議盡量少用甚至不用goto語(yǔ)句。語(yǔ)句。 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)81DECLARE v_counter BINARY_INTEGER :=1;BEGIN INSERT INTO temp_table VALUES (v_counter, Loop index); v_counter := v_Counter + 1; IF v_counter:1 USING P_SALARY; LOOP FETCH C1 INTO R_EMP; EXIT WHEN C1%NOT

50、FOUND; DBMS_OUTPUT.PUT_LINE(薪水大于薪水大于|TO_CHAR(P_SALARY) |的員工為:的員工為:); DBMS_OUTPUT.PUT_LINE(ID為為T(mén)O_CHAR(R_EMP)| 其姓名為:其姓名為:|R_EMP.NAME); END LOOP; CLOSE C1;END CREATE_TABLE;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)124在在PL/SQL接收用戶(hù)輸入接收用戶(hù)輸入n不同開(kāi)發(fā)環(huán)境采用不同的方式不同開(kāi)發(fā)環(huán)境采用不同的方式nSQL *plus環(huán)境采用環(huán)境采用替換變量(替換變量(P74)大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)12514.5 14.5 異常處理異常處

51、理n異常概述異常概述n異常處理過(guò)程異常處理過(guò)程 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)126.1異常概述異常概述nOracle錯(cuò)誤處理機(jī)制錯(cuò)誤處理機(jī)制n異常的類(lèi)型異常的類(lèi)型大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)127nPL/SQL錯(cuò)誤(錯(cuò)誤( P290 )n編譯錯(cuò)誤編譯錯(cuò)誤n運(yùn)行時(shí)錯(cuò)誤(運(yùn)行時(shí)錯(cuò)誤(運(yùn)行時(shí)可能出現(xiàn),也可能不出運(yùn)行時(shí)可能出現(xiàn),也可能不出現(xiàn)現(xiàn)):):PL/SQL運(yùn)行引擎運(yùn)行引擎n異常處理機(jī)制異常處理機(jī)制n一個(gè)錯(cuò)誤對(duì)應(yīng)一個(gè)異常一個(gè)錯(cuò)誤對(duì)應(yīng)一個(gè)異常n程序控制權(quán)發(fā)生了轉(zhuǎn)移程序控制權(quán)發(fā)生了轉(zhuǎn)移:異常拋出后,會(huì)被:異常拋出后,會(huì)被異常處理器異常處理器捕獲。捕獲。 Oracle錯(cuò)誤處理機(jī)制錯(cuò)誤

52、處理機(jī)制大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)128n異常的類(lèi)型異常的類(lèi)型n預(yù)定義的預(yù)定義的Oracle異常異常n非預(yù)定義的非預(yù)定義的Oracle異常異常n用戶(hù)定義的異常用戶(hù)定義的異常大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)129預(yù)定義的異常預(yù)定義的異常異常情況名異常情況名錯(cuò)誤代碼錯(cuò)誤代碼描述描述CURSOR_ALREADY_OPEN ORA-06511 嘗試打開(kāi)已經(jīng)打開(kāi)的游標(biāo)嘗試打開(kāi)已經(jīng)打開(kāi)的游標(biāo) INVALID_CURSORORA-01001不合法的游標(biāo)操作(如要訪問(wèn)不合法的游標(biāo)操作(如要訪問(wèn)已經(jīng)關(guān)閉的游標(biāo))已經(jīng)關(guān)閉的游標(biāo)) NO_DATA_FOUNDORA-01403沒(méi)有發(fā)現(xiàn)數(shù)據(jù)(沒(méi)有發(fā)現(xiàn)數(shù)據(jù)( SELECT

53、 INTO )TOO_MANY_ROWSORA-01422返回了多行數(shù)據(jù)(返回了多行數(shù)據(jù)(SELECT INTO)INVALID_NUMBERORA-01722轉(zhuǎn)換成數(shù)字失敗轉(zhuǎn)換成數(shù)字失敗 (X) VALUE_ERRORORA-06502截?cái)?、算法或轉(zhuǎn)換錯(cuò)誤,通常截?cái)?、算法或轉(zhuǎn)換錯(cuò)誤,通常出現(xiàn)在賦值錯(cuò)誤出現(xiàn)在賦值錯(cuò)誤 ZERO_DIVIDEORA-01476除數(shù)為除數(shù)為0 ROWTYPE_MISMATCHORA-06504主機(jī)游標(biāo)變量與主機(jī)游標(biāo)變量與PL/SQL游標(biāo)游標(biāo)變量類(lèi)型不匹配變量類(lèi)型不匹配大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)130如何判定字符串是合法數(shù)字?如何判定字符串是合法數(shù)字?DECLAR

54、E V_INPUT VARCHAR2(20); V_EMPNO NUMBER; V_EMP EMP%ROWTYPE;BEGIN V_EMPNO:= # V_INPUT:=# V_EMPNO:=to_number(V_INPUT); V_EMPNO:=1+V_INPUT; SELECT * INTO V_EMP FROM EMP WHERE EMPNO=V_INPUT;VALUE_ERRORINVALID_NUMBER大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)131EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE(不是數(shù)字

55、不是數(shù)字); WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE(不是數(shù)字不是數(shù)字);END;大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)132異常情況名異常情況名錯(cuò)誤代碼錯(cuò)誤代碼描述描述DUP_VAL_ON_INDEXORA-00001 違反唯一性約束或主鍵約束違反唯一性約束或主鍵約束SYS_INVALID_ROWIDORA-01410 轉(zhuǎn)換成轉(zhuǎn)換成ROWID失敗失敗TIMEOUT_ON_RESOURCEORA-00051 在等待資源中出現(xiàn)超時(shí)在等待資源中出現(xiàn)超時(shí)LOGIN_DENIEDORA-01017 無(wú)效用戶(hù)名無(wú)效用戶(hù)名/密碼密碼CASE_NOT_FOUNDOR

56、A-06592 沒(méi)有匹配的沒(méi)有匹配的WHEN子句子句N(xiāo)OT_LOGGED_ONORA-01012 沒(méi)有與數(shù)據(jù)庫(kù)建立連接沒(méi)有與數(shù)據(jù)庫(kù)建立連接STORAGE_ERRORORA-06500 內(nèi)存不足內(nèi)存不足PROGRAM_ERRORORA-06501 PL/SQL內(nèi)部錯(cuò)誤內(nèi)部錯(cuò)誤大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)133異常情況名異常情況名錯(cuò)誤代碼錯(cuò)誤代碼描述描述ACCESS_INTO_NULLORA-06530給空對(duì)象屬性賦值給空對(duì)象屬性賦值COLLECTION_IS_NULLORA-06531對(duì)某對(duì)某NULL PL/SQL表或可表或可變數(shù)組試圖應(yīng)用集合方法,變數(shù)組試圖應(yīng)用集合方法,而不是而不是EXIST

57、S SELF_IS_NULLORA-30625調(diào)用空對(duì)象實(shí)例的方法調(diào)用空對(duì)象實(shí)例的方法SUBSCRIPT_BEYOND_COUNT ORA-06533對(duì)嵌套表、索引、可變數(shù)對(duì)嵌套表、索引、可變數(shù)組引用時(shí)超出集合中元素組引用時(shí)超出集合中元素的數(shù)量的數(shù)量SUBSCRIPT_OUTSIDE_LIMITORA-06532對(duì)對(duì)可變數(shù)組可變數(shù)組的引用超出聲的引用超出聲明的范圍明的范圍大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)134(系統(tǒng)系統(tǒng))非預(yù)定義異常非預(yù)定義異常n特點(diǎn):系統(tǒng)自動(dòng)觸發(fā)(只有編號(hào),沒(méi)聲明)特點(diǎn):系統(tǒng)自動(dòng)觸發(fā)(只有編號(hào),沒(méi)聲明)n錯(cuò)誤錯(cuò)誤在在Oracle內(nèi)部有定義,但是沒(méi)有被聲明為異常內(nèi)部有定義,但是沒(méi)有

58、被聲明為異常n定義方法(在語(yǔ)句塊的定義方法(在語(yǔ)句塊的聲明部分聲明部分):):n聲明一個(gè)異常名稱(chēng):聲明一個(gè)異常名稱(chēng): e_integrity EXCEPTION;n通過(guò)通過(guò)PRAGMA EXCEPTION_INIT 將異常與一個(gè)將異常與一個(gè)Oracle錯(cuò)誤號(hào)相關(guān)聯(lián)錯(cuò)誤號(hào)相關(guān)聯(lián): PRAGMA EXCEPTION_INIT(e_integrity, -2291)n在異常處理部分捕捉并處理異常:在異常處理部分捕捉并處理異常:nWHEN e_integrity THEN . 大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)135大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)136用戶(hù)自定義的異常用戶(hù)自定義的異常nOracle不認(rèn)為是錯(cuò)誤

59、,用戶(hù)程序定義的異常:不認(rèn)為是錯(cuò)誤,用戶(hù)程序定義的異常:n目的?目的?n用戶(hù)自定義異常必須在聲明部分進(jìn)行聲明用戶(hù)自定義異常必須在聲明部分進(jìn)行聲明n無(wú)需無(wú)需PROGMA EXCEPTION_INITn系統(tǒng)不能自動(dòng)觸發(fā)異常系統(tǒng)不能自動(dòng)觸發(fā)異常n需要需要用戶(hù)使用用戶(hù)使用RAISE語(yǔ)句語(yǔ)句。n和所有異常一樣,在和所有異常一樣,在異常處理部分異常處理部分捕捉并處理捕捉并處理異常。異常。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)13714.5.2 14.5.2 (總結(jié))異常處理過(guò)程(總結(jié))異常處理過(guò)程n非預(yù)定義異常非預(yù)定義異常和和用戶(hù)定義異常用戶(hù)定義異常:在聲明部分:在聲明部分定義定義異常異常ne_exception

60、EXCEPTION;nPRAGMA EXCEPTION_INIT(e_exceptioin,-#);n在執(zhí)行過(guò)程中,在執(zhí)行過(guò)程中,拋出異常的方式拋出異常的方式:n用戶(hù)用戶(hù)程序主動(dòng)程序主動(dòng)RAISE user_define_exception;n當(dāng)錯(cuò)誤產(chǎn)生時(shí),當(dāng)錯(cuò)誤產(chǎn)生時(shí),系統(tǒng)自動(dòng)系統(tǒng)自動(dòng)n在異常處理部分通過(guò)異常處理器捕獲異常,并進(jìn)在異常處理部分通過(guò)異常處理器捕獲異常,并進(jìn)行行異常處理異常處理。大型數(shù)據(jù)庫(kù)系統(tǒng)大型數(shù)據(jù)庫(kù)系統(tǒng)138異常的捕獲與處理異常的捕獲與處理異常處理器的基本形式為:異常處理器的基本形式為:EXCEPTION WHEN exception1OR excetpion2 THEN sequence_of_statements1; WH

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論