




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Oracle10g 數據庫基礎教程1第第14章章 PL/SQL語言基礎語言基礎Oracle10g 數據庫基礎教程2本章內容本章內容pPL/SQL概述pPL/SQL基礎p控制結構p游標p異常處理Oracle10g 數據庫基礎教程3本章要求本章要求p掌握PL/SQL程序基本結構p掌握PL/SQL程序控制結構p掌握PL/SQL程序游標應用p掌握PL/SQL程序異常處理機制Oracle10g 數據庫基礎教程414.1 PL/SQL概述概述pPL/SQL特點pPL/SQL功能特性pPL/SQL執行過程與開發工具Oracle10g 數據庫基礎教程514.1.1 PL/SQL特點特點p與SQL語言緊密集成。
2、p減小網絡流量,提高應用程序的運行性能。p模塊化的程序設計功能,提高了系統可靠性。p服務器端程序設計,可移植性好。Oracle10g 數據庫基礎教程614.1.2 PL/SQL功能特性功能特性p語句塊結構p異常處理p變量和類型p條件語句p循環結構p游標p過程、函數和觸發器p包p集合p動態SQLp批綁定p對象特性Oracle10g 數據庫基礎教程714.1.3 PL/SQL執行過程與開發工具執行過程與開發工具PL/SQL塊SQL語句客戶端應用程序PL/SQL引擎數據庫服務器過程化語句執行器SQL執行器塊中SQL語句pPL/SQL執行過程 Oracle10g 數據庫基礎教程8pPL/SQL開發工具
3、pSQL *PLUSpProcedure BuilderpOracle Form、Oracle ReportspPL/SQL DeveloperOracle10g 數據庫基礎教程914.2 PL/SQL基礎基礎pPL/SQL程序結構 p詞法單元 p數據類型p變量與常量pPL/SQL記錄 p編譯指示pPL/SQL中的SQL語句Oracle10g 數據庫基礎教程1014.2.1 PL/SQL程序結構程序結構pPL/SQL塊的組成pPL/SQL塊分類 Oracle10g 數據庫基礎教程11(1)PL/SQL塊的組成塊的組成pPL/SQL程序的基本單元是語句塊,所有的PL/SQL程序都是由語句塊構成的
4、 。p一個完整的PL/SQL語句塊由3個部分組成。 DECLARE 聲明部分,定義變量、數據類型、異常、局部子程序等 BEGIN 執行部分,實現塊的功能 EXCEPTION 異常處理部分,處理程序執行過程中產生的異常 END; Oracle10g 數據庫基礎教程12p聲明部分p主要用于聲明變量、常量、數據類型、游標、異常處理名稱以及本地(局部)子程序定義等。 p可執行部分p執行部分是PL/SQL塊的功能實現部分。該部分通過變量賦值、流程控制、數據查詢、數據操縱、數據定義、事務控制、游標處理等實現塊的功能。p異常處理部分p異常處理部分用于處理該塊執行過程中產生的異常。 Oracle10g 數據庫
5、基礎教程13p注意:p執行部分是必須的,而聲明部分和異常部分是可選的p可以在一個塊的執行部分或異常處理部分嵌套其他的PL/SQL塊;p所有的PL/SQL塊都是以“END;”結束。Oracle10g 數據庫基礎教程14pDECLAREp v_ename VARCHAR2(10);pBEGINp SELECT ename INTO v_ename FROM emp p WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_ename);pEXCEPTIONp WHEN NO_DATA_FOUND THENp DBMS_OUTPUT.PUT_LINE(There is
6、not such a employee);pEND;Oracle10g 數據庫基礎教程15pDECLAREp v_sal NUMBER(6,2);p v_deptno NUMBER(2);pBEGIN p BEGINp SELECT deptno INTO v_deptno FROM emp p WHERE empno=7844;p END;p SELECT avg(sal) INTO v_sal FROM emp p WHERE deptno=v_deptno;p DBMS_OUTPUT.PUT_LINE(v_sal);pEND;Oracle10g 數據庫基礎教程16p注意p若要在SQL*P
7、lus環境中看到DBMS_OUTPUT.PUT_LINE方法的輸出結果,必須將環境變量SERVEROUTPUT設置為ON。pSET SERVEROUTPUT ONOracle10g 數據庫基礎教程17(2)PL/SQL塊分類塊分類p匿名塊p匿名塊是指動態生成,只能執行一次的塊,不能由其他應用程序調用。p命名塊p命名塊是指一次編譯可多次執行的PL/SQL程序,包括函數、存儲過程、包、觸發器等。它們編譯后放在服務器中,由應用程序或系統在特定條件下調用執行。 Oracle10g 數據庫基礎教程18p命名塊示例pCREATE OR REPLACE PROCEDURE showavgsal p(p_de
8、ptno NUMBER)pASp v_sal NUMBER(6,2);pBEGINp SELECT avg(sal) INTO v_sal FROM emp p WHERE deptno=p_deptno;p DBMS_OUTPUT.PUT_LINE(v_sal);pEND showavgsal;Oracle10g 數據庫基礎教程1914.2.2 詞法單元詞法單元p字符集p標識符p分隔符p常量值p注釋Oracle10g 數據庫基礎教程20(1)字符集)字符集pPL/SQL的字符集包括:p大小寫字母:AZ,azp數字:09p空白:制表符、空格和回車p數字符號:+ - * / =p標點符號: !
9、# $ % &* ()_ | ? ; :, . “ p注意pPL/SQL字符集不區分大小寫。Oracle10g 數據庫基礎教程21(2)標識符)標識符p標識符用于定義PL/SQL變量、常量、異常、游標名稱、游標變量、參數、子程序名稱和其他的程序單元名稱等。p在PL/SQL程序中,標識符是以字母開頭的,后邊可以跟字母、數字、美元符號($)、井號(#)或下劃線(_),其最大長度為30個字符,并且所有字符都是有效的。p例如,X,v_empno,v_$等都是有效的標識符,而X+y,_temp則是非法的標識符。p注意p如果標識符區分大小寫、使用預留關鍵字或包含空格等特殊符號,則需要用“”括起來,
10、稱為引證標識符。例如標識符“my book”和“exception”。Oracle10g 數據庫基礎教程22(3)分隔符)分隔符p+p-p*p/p=p:=pp=pp!=p=p=p(p)p/*p*/pp%p;p:p.pp“p.pp|p=p*p-p分隔符是指有特定含義的單個符號或組合符號 Oracle10g 數據庫基礎教程23(4)常量值)常量值p字符型文字p以單引號引起來的字符串,在字符串中的字符區分大小寫。如果字符串中本身包含單引號,則用兩個連續的單引號進行轉義。p數字型文字p分為整數與實數兩類。其中,整數沒有小數點,如123;而實數有小數點,如123.45。可以用科學計數法表示數字型文字,如
11、123.45可以表示為1.2345E2。p布爾型文字p預定義的布爾型變量的取值,包括TRUE,FALSE,NULL三個值。p日期型文字p表示日期值,其格式隨日期類型格式不同而不同。Oracle10g 數據庫基礎教程24(5)注釋)注釋p單行注釋p-p多行注釋p以 “/*”開始,以“*/”結束。pDECLAREp v_department CHAR(10); p - variable to hold the department name p BEGIN p /* query the department name which p department number is 10 ouput th
12、e department p name into v_department*/p SELECT dname INTO v_department FROM dept p WHERE deptno=10;p END; Oracle10g 數據庫基礎教程2514.2.3 數據類型數據類型p數字類型p字符類型p日期/區間類型p行標識類型p布爾類型p原始類型pLOB類型p引用類型 p記錄類型p集合類型p%TYPE與%ROWTYPEOracle10g 數據庫基礎教程26PL/SQL中常用的基本數據類型分類數據類型數字類型NUMBER、BINARY_NUMBER PLS_NUMBER字符類型VARCHAR2
13、、CHAR、LONG、NCHAR、NVARCHAR日期/區間類型 DATE、TIMESTAMP、INTERVAL行標識類型ROWID、UROWID布爾類型BOOLEAN(TRUE、FALSE、NULL)原始類型RAW、LONG RAWLOB類型CLOB、BLOB、NCLOB、BFILE引用類型 REF CURSOR,REF object_type。 記錄類型RECORD集合類型TABLE、VARRAYOracle10g 數據庫基礎教程27p數字類型 pNUMBER類型以十進制形式存儲整數和浮點數,語法為NUMBER(p,s)。其中,p為精度,即所有有效數字位數;s為刻度范圍,即小數位數。p的取
14、值范圍為138。pBINARY_INTEGER類型用于表示從-2147483647 7之間的整數,以二進制形式存儲。當發生溢出時,將自動轉換成NUMBER類型。pPLS_INTEGER類型表示范圍與BINARY_INTEGER相同,但發生溢出時會產生錯誤。Oracle10g 數據庫基礎教程28p字符類型 pPL/SQL中的字符類型與Oracle數據庫中的字符類型類似,但是允許字符串的長度有所不同。pVARCHAR2,CHAR主要用于存儲來自本地數據庫字符集的字符,而NCHAR,NVARCHAR2 用于存儲來自國家字符集的字符串。 類 型PL/SQL中最大字節數Oracle中最大字節數VARCH
15、AR2327674000NVARCHAR2327674000CHAR327672000NCHAR327672000LONG327602GBOracle10g 數據庫基礎教程29p日期/區間類型 pDATE:與數據庫中的DATE類型相同,存儲日期和時間信息,包括世紀、年、月、日、小時、分和秒,不包括秒的小數部分。pTIMESTAMP:與DATE類型相似,但包括秒的小數部分,有以下3種形式。pTIMESTAMP(p):其中p為秒字段的小數部分精度。pTIMESTAMP(p)WITH TIME ZONE:返回當前時區的時間戳。pTIMESTAMP(p)WITH LOACL TIME ZONE:返回數
16、據庫時區的時間戳。Oracle10g 數據庫基礎教程30nINTERVAL:用于存儲兩個時間戳之間的時間間隔,:用于存儲兩個時間戳之間的時間間隔,有下面兩種形式。有下面兩種形式。nINTERVAL YEAR (p)TO MONTH:兩個時間:兩個時間戳相差的年數和月數。戳相差的年數和月數。nINTERVAL DAY(dp) TO SECOND(sp):兩個時間戳相差的天數和秒數。兩個時間戳相差的天數和秒數。Oracle10g 數據庫基礎教程31p行標識類型pROWID表示行的物理地址pUROWID既可以表示行的物理地址,也可以表示行的邏輯地址。p布爾類型(BOOLEAN)p只能在PL/SQL中
17、使用,其取值為邏輯值,包括TRUE、FALSE、NULL。p原始類型p與Oracle數據庫中的原始類型相似,但子節數不同。 類 型PL/SQL中最大字節數Oracle中最大字節數RAW327672000LONG RAW327672GOracle10g 數據庫基礎教程32pLOB類型p包括BLOB,CLOB,NCLOB和BFILE四種類型。其中BLOB存放二進制數據,CLOB,NCLOB存放文本數據,而BFILE存放指向操作系統文件的指針。pLOB類型變量可以存儲4 GB的數據量。p引用類型p引用類型類似于其他高級語言中的指針類型。在PL/SQL中,引用類型包括游標的引用類型和對象的引用類型,即
18、REF CURSOR和REF object_type。Oracle10g 數據庫基礎教程33p記錄類型p記錄類型是復合類型,類似于C語言中的結構體,是一個包含若干個成員分量的復合類型。p在使用記錄類型時,需要先在聲明部分定義記錄類型和記錄類型的變量,然后在執行部分引用該記錄類型變量或其成員分量。p集合類型p集合類型是復合類型,包括索引表類型、嵌套表類型和可變數組類型。p集合類型與記錄類型的區別在于,記錄類型中的成員分量可以是不同類型的,類似于結構體,而集合類型中所有的成員分量必須具有相同的數據類型,類似于數組。 Oracle10g 數據庫基礎教程34p%TYPE與%ROWTYPEp如果要定義一
19、個類型與某個變量的數據類型或數據庫表中某個列的數據類型一致(不知道該變量或列的數據類型)的變量,可以利用%TYPE來實現。p如果要定義一個與數據庫中某個表結構一致的記錄類型的變量,可以使用%ROWTYPE來實現。 p注意p變量的類型隨參照的變量類型、數據庫表列類型、表結構的變化而變化;p 如果數據庫表列中有NOT NULL約束,則%TYPE與%ROWTYPE返回的數據類型沒有此限制。 Oracle10g 數據庫基礎教程35pDECLAREp v_sal emp.sal%TYPE;p v_emp emp%ROWTYPE;pBEGINp SELECT sal INTO v_sal FROM emp
20、 WHERE empno=7844;p SELECT * INTO v_emp FROM emp WHERE empno=7900;p DBMS_OUTPUT.PUT_LINE(v_sal);p DBMS_OUTPUT.PUT_LINE(v_emp.ename|v_emp.sal);pEND; Oracle10g 數據庫基礎教程3614.2.4 變量與常量變量與常量p變量與常量的定義p變量的作用域Oracle10g 數據庫基礎教程37變量聲明(1)變量與常量的定義)變量與常量的定義p變量定義的一般格式pvariable_name CONSTANT datatype NOT NULL DEFAU
21、LT|:=expression;p說明p變量或常量名稱是一個PL/SQL標識符,應符合標識符命名規范;p每行只能定義一個變量;p如果加上關鍵字CONSTANT,則表示所定義的是一個常量,必須為它賦初值;p如果定義變量時使用了NOT NULL關鍵字,則必須為變量賦初值;p如果變量沒有賦初值,則默認為NULL;p使用DEFAULT或“:=”運算符為變量初始化。Oracle10g 數據庫基礎教程38pDECLAREp v1 NUMBER(4);p v2 NUMBER(4) NOT NULL :=10;p v3 CONSTANT NUMBER(4) DEFAULT 100;pBEGINp IF v1
22、IS NULL THEN p DBMS_OUTPUT.PUT_LINE(V1 IS NULL! );p END IF;p DBMS_OUTPUT.PUT_LINE(v2| |v3);pEND;Oracle10g 數據庫基礎教程39(2)變量的作用域)變量的作用域p變量的作用域是指變量的有效作用范圍,從變量聲明開始,直到塊結束。p如果PL/SQL塊相互嵌套,則在內部塊中聲明的變量是局部的,只能在內部塊中引用,而在外部塊中聲明的變量是全局的,既可以在外部塊中引用,也可以在內部塊中引用。p如果內部塊與外部塊中定義了同名變量,則在內部塊中引用外部塊的全局變量時需要使用外部塊名進行標識。 Oracle1
23、0g 數據庫基礎教程40ppDECLAREp v_ename CHAR(16);p v_outer NUMBER(5);pBEGINp v_outer :=10;p DECLAREp v_ename CHAR(20); p v_inner DATE;p BEGINp v_inner:=sysdate;p v_ename:=INNER V_ENAME;p OUTER.v_ename:=OUTER V_ENAME;p END;p DBMS_OUTPUT.PUT_LINE(v_ename);pEND; Oracle10g 數據庫基礎教程4114.2.5 PL/SQL記錄記錄 p用戶定義記錄類型及變量
24、 p利用%ROWTYPE獲取記錄類型定義變量 p記錄類型變量的應用 p在SELECT語句中使用記錄類型變量 p在INSERT語句中使用記錄類型變量 p在UPDATE語句中使用記錄類型變量 p在DELETE語句中使用記錄類型變量 Oracle10g 數據庫基礎教程42(1)用戶定義記錄類型及變量)用戶定義記錄類型及變量 p定義記錄類型的語法為pTYPE record_type IS RECORD(pfield1 datatype1 NOT NULLDEFAULT|:=expr1,pfield2 datatype2 NOT NULL DEFAULT|:=expr2,ppfieldn datatyp
25、en NOT NULL DEFAULT|:=exprn);p注意:p相同記錄類型的變量可以相互賦值;p不同記錄類型的變量,即使成員完全相同也不能相互賦值;p記錄類型只能應用于定義該記錄類型的PL/SQL塊中,即記錄類型是局部的。Oracle10g 數據庫基礎教程43p利用記錄類型以及記錄類型變量,保存員工信息。 pDECLAREp TYPE t_emp IS RECORD(p empno NUMBER(4), p ename CHAR(10),p sal NUMBER(6,2);p v_emp t_emp;pBEGINp SELECT empno,ename,sal INTO v_emp p
26、FROM emp WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_emp.ename| |v_emp.sal);pEND;Oracle10g 數據庫基礎教程44(2)利用)利用%ROWTYPE獲取記錄類型獲取記錄類型定義變量定義變量pDECLAREp v_emp1 emp%ROWTYPE;p v_emp2 emp%ROWTYPE;p CURSOR c_emp IS SELECT empno,ename FROM emp p WHERE deptno=10;p v_emp10 c_emp%ROWTYPE; pBEGINp SELECT * INTO v_emp
27、1 FROM emp WHERE empno=7844;p OPEN c_emp; p LOOPp FETCH c_emp INTO v_emp10;p EXIT WHEN c_emp%NOTFOUND;p DBMS_OUTPUT.PUT_LINE(v_emp10.empno| |p v_emp10.ename); p END LOOP; p CLOSE c_emp;pEND; Oracle10g 數據庫基礎教程45(3)記錄類型變量的應用)記錄類型變量的應用p在SELECT語句中使用記錄類型變量 p在SELECT INTO 語句中使用記錄類型變量pDECLAREp v_emp emp%ROW
28、TYPE; pBEGINp SELECT * INTO v_emp FROM empp WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_emp.empno| | p v_emp.ename| |v_emp.sal); pEND;p注意p記錄類型變量中分量的個數、順序、類型應該與查詢列表中列的個數、順序、類型完全匹配。 Oracle10g 數據庫基礎教程46p在SELECT語句中使用記錄類型變量p在SELECT INTO 語句中使用記錄類型變量成員pDECLAREp v_emp emp%ROWTYPE; pBEGINp SELECT empno,ename,s
29、al INTO v_emp.empno, p v_emp.ename,v_emp.sal FROM emp p WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_emp.empno|p v_emp.ename|v_emp.sal); pEND;Oracle10g 數據庫基礎教程47p在INSERT語句中使用記錄類型變量p在VALUES子句中使用記錄類型變量 pDECLAREp v_dept dept%ROWTYPE;pBEGINp v_dept.deptno:=50;p v_dept.loc:=BEIJING;p V_dept.dname:=COMPUTER;
30、p INSERT INTO DEPT VALUES v_dept;pEND;p注意p記錄類型變量中分量的個數、順序、類型應該與表中列的個數、順序、類型完全匹配。 Oracle10g 數據庫基礎教程48p在INSERT語句中使用記錄類型變量p在VALUES子句中使用記錄類型變量成員 pDECLAREp v_emp emp%ROWTYPE;pBEGINp SELECT * INTO v_emp FROM emp p WHERE empno=7844; p INSERT INTO emp(empno,ename,mgr,sal) p VALUES(1234,TOM,v_emp.mgr,v_emp.
31、sal);pEND; Oracle10g 數據庫基礎教程49p在UPDATE語句中使用記錄類型變量p在SET子句中使用記錄類型變量(使用ROW關鍵字) pDECLAREp v_dept dept%ROWTYPE;pBEGINp v_dept.deptno:=50;p v_dept.loc:=TIANJIN;p V_dept.dname:=COMPUTER;p UPDATE dept SET ROW=v_dept WHERE deptno=50;pEND;p注意p記錄類型變量中分量的個數、順序、類型應該與表中列的個數、順序、類型完全匹配。 Oracle10g 數據庫基礎教程50p在UPDATE語
32、句中使用記錄類型變量p在SET子句中使用記錄類型變量成員pDECLAREp v_emp emp%ROWTYPE;p BEGINp SELECT * INTO v_emp FROM emp p WHERE empno=7844;p UPDATE emp SET sal=v_emp.sal, comm=v_mp WHERE empno=7369;p END;Oracle10g 數據庫基礎教程51p在DELETE語句中使用記錄類型變量pDECLAREp v_emp emp%ROWTYPE;p BEGINp SELECT * INTO v_emp FROM emp p WHERE empno=7844
33、;p DELETE FROM emp WHERE deptno=v_emp.deptno;p END; Oracle10g 數據庫基礎教程5214.2.6 編譯指示編譯指示p編譯指示是對編譯程序發出的特殊指令,也稱為偽指令,不會改變程序含義。它只是向編譯程序傳遞信息,類似于嵌入在SQL中的注釋。p在PL/SQL中使用PRAGMA關鍵字通知編譯程序,PL/SQL語句的剩余部分是一個編譯指示或命令。編譯指示在編譯時被處理,而不會在運行時被執行,類似于C語言中的#define。Oracle10g 數據庫基礎教程53pPL/SQL提供以下4種編譯指示pEXCEPTION_INIT:告訴編譯程序將一個特
34、定的錯誤號與程序中所聲明的異常標識符關聯起來。pRESTRICT_REFERENCES:告訴編譯程序打包程序的純度,即對函數中可以使用的SQL語句和包變量進行限制。pSERIALLY_REUSEABLE:告訴PL/SQL運行引擎時,在數據引用之間不要保持包級數據。pAUTONOMOUS_TRANSACTION:告訴編譯程序,該程序塊為自治事務,即該事務的提交和回滾是獨立進行的。Oracle10g 數據庫基礎教程5414.2.7 PL/SQL中中SQL語句語句p由于PL/SQL執行采用早期綁定,即在編譯階段對變量進行綁定,識別程序中標識符的位置,檢查用戶權限、數據庫對象等信息,因此在PL/SQL
35、中只允許出現: pSELECT pDML(UPDATE、DELETE、INSERT)p事務控制語句(COMMIT、ROLLBACK、SAVEPOINT)p注意pDDL語句不可以直接使用Oracle10g 數據庫基礎教程55p通常,利用SQL語句對數據庫進行操作時,各種相關量都在代碼中以常量的形式指定,而在PL/SQL中可以通過變量動態指定各種相關量的值,從而實現對數據庫的動態操作。pDECLARE p v_empno NUMBER(4);pBEGINp v_empno:=&x;p UPDATE emp SET sal=sal+100 WHERE empno=v_empno;pEND;
36、Oracle10g 數據庫基礎教程56pSELECT語句p在PL/SQL程序中,使用SELECTINTO語句查詢一個記錄的信息。p其語法為:pSELECT select_list_item INTO pvariable_list|record_variable pFROM tablepWHERE condition; Oracle10g 數據庫基礎教程57p根據員工名或員工號查詢員工信息,程序為:pDECLAREp v_emp emp%ROWTYPE;p v_ename emp.ename%type;p v_sal emp.sal%type;pBEGINp SELECT * INTO v_em
37、p FROM emp p WHERE ename=SMITH;p DBMS_OUTPUT.PUT_LINE(v_emp.empno| |v_emp.sal);p SELECT ename,sal INTO v_ename,v_sal FROM emp p WHERE empno=7900;p DBMS_OUTPUT.PUT_LINE(v_ename| |v_sal);pEND; Oracle10g 數據庫基礎教程58p注意:pSELECTINTO語句只能查詢一個記錄的信息,如果沒有查詢到任何數據,會產生NO_DATA_FOUND異常;如果查詢到多個記錄,則會產生TOO_MANY_ROWS異常。
38、pINTO句子后的變量用于接收查詢的結果,變量的個數、順序應該與查詢的目標數據相匹配,也可以是記錄類型的變量。Oracle10g 數據庫基礎教程59p用SELECTINTO語句查詢10號部門所有員工信息。pDECLAREp v_emp emp%ROWTYPE;p BEGINp SELECT * INTO v_emp FROM emp WHERE deptno=10;p END;p /p*pERROR 位于第 1 行:pORA-01422: 實際返回的行數超出請求的行數pORA-06512: 在line 4Oracle10g 數據庫基礎教程60pDML語句pPL/SQL中DML語句對標準SQL語
39、句中的DML語句進行了擴展,允許使用變量。pDECLAREp v_empno emp.empno%TYPE :=7500;pBEGINp INSERT INTO emp(empno,ename,sal,deptno) p VALUES(v_empno,JOAN,2300,20);p UPDATE emp SET sal=sal+100 p WHERE empno=v_empno;p DELETE FROM emp WHERE empno=v_empno;pEND; Oracle10g 數據庫基礎教程61pWHEREp標識符的區分p系統首先查看WHERE子句中的標識符是否與表中的列名相同,如果相
40、同,則該標識符被解釋為列名;如果沒有同名列,系統檢查該標識符是不是PL/SQL語句塊的變量。p字符串比較p填充比較:通過在短字符串后添加空格,使兩個字符串達到相同長度,然后根據每個字符的ASCII碼進行比較。p非填充比較:根據每個字符的ASCII碼進行比較,最先結束的字符串為小。Oracle10g 數據庫基礎教程62p那么何時采用填充比較,何時采用非填充比較呢?pPL/SQL中規定,對定長的字符串(CHAR類型的字符串和字符串常量)采用填充比較;如果比較的字符串中有一個是變長字符串(VARCHAR2類型的字符串),則采用非填充比較。 Oracle10g 數據庫基礎教程63p例如,已知emp表中
41、ename列類型為VARCHAR2(10),執行下面的代碼。pDECLAREp v_ename CHAR(10):=TURNER;p-v_ename VARCHAR2(20);p -v_ename emp.ename%TYPE:=TURNER;p v_sal emp.sal%TYPE;pBEGINp SELECT sal INTO v_sal FROM emp WHERE ename=v_ename;p dbms_output.put_line(v_sal);pEND;p /pDECLAREp*p第 1 行出現錯誤:pORA-01403: 未找到數據pORA-06512: 在 line 6 O
42、racle10g 數據庫基礎教程64p產生錯誤的原因是VARCHAR2(10)類型與CHAR(10)類型比較時采用非填充比較,因此無法查詢到員工名為“TURNER”的員工。可以將v_ename變量類型修改為VARCHAR2(10)類型,也可以直接采用emp.ename%TYPE方式定義。p因此,為了保證程序的正確執行,一定要使PL/SQL語句塊中的變量與要比較的數據庫列擁有相同的數據類型,可以使用%TYPE或%ROWTYPE來定義變量。Oracle10g 數據庫基礎教程65pRETURNINGp如果要查詢當前DML語句操作的記錄的信息,可以在DML語句末尾使用RETURNING語句返回該記錄的
43、信息。pRETURNING語句的基本語法:pRETURNING select_list_item INTO variable_list|record_variable; Oracle10g 數據庫基礎教程66pDECLAREp v_sal emp.sal%TYPE;pBEGINp UPDATE emp SET sal=sal+100 WHERE empno=7844 p RETURNING sal INTO v_sal;p DBMS_OUTPUT.PUT_LINE(v_sal);pEND;Oracle10g 數據庫基礎教程6714.3 14.3 控制結構控制結構 p選擇結構p循環結構p跳轉結構
44、Oracle10g 數據庫基礎教程6814.3.1選擇結構選擇結構pIF語句pCASE語句Oracle10g 數據庫基礎教程69(1)IF語句語句p語法語法pIF condition1 THEN statements1;pELSIF condition2 THEN statements2;ppELSE else_statements;pEND IF; p注意注意p條件是一個布爾型變量或表達式,取值只能是條件是一個布爾型變量或表達式,取值只能是TRUE,FALSE,NULL。Oracle10g 數據庫基礎教程70p例如,輸入一個員工號,修改該員工的工資,如果該員工為10號部門,工資增加100;若
45、為20號部門,工資增加160;若為30號部門,工資增加200;否則增加300。 Oracle10g 數據庫基礎教程71pDECLAREp v_deptno emp.deptno%type;p v_increment NUMBER(4);p v_empno emp.empno%type;pBEGINp v_empno:=&x;p SELECT deptno INTO v_deptno FROM emp p WHERE empno=v_empno;p IF v_deptno=10 THEN v_increment:=100;p ELSIF v_deptno=20 THEN v_increm
46、ent:=160;p ELSIF v_deptno=30 THEN v_increment:=200;p ELSE v_increment:=300;p END IF;p UPDATE emp SET sal=sal+v_increment p WHERE empno=v_empno;pEND;Oracle10g 數據庫基礎教程72p由于PL/SQL中的邏輯運算結果有TRUE,FALSE和NULL三種,因此在進行選擇條件判斷時,要考慮條件為NULL的情況。例如,下面兩個程序,如果不考慮條件為NULL的情況,則運行結果是一致的,但是若考慮條件為NULL的情況,則結果就不同了。 Oracle10g
47、 數據庫基礎教程73Oracle10g 數據庫基礎教程74p為了避免條件為NULL時出現歧義,應該在程序中進行條件是否為NULL的檢查。 Oracle10g 數據庫基礎教程75(2)CASE語句語句p基本語法pCASEp WHEN condition1 THEN statements1;p WHEN condition2 THEN statements2;p p WHEN conditionn THEN statementsn;p ELSE else_statements;pEND CASE;p注意 p在CASE語句中,當第一個WHEN條件為真時,執行其后的操作,操作完后結束CASE語句。其他
48、的WHEN條件不再判斷,其后的操作也不執行。 Oracle10g 數據庫基礎教程76p根據輸入的員工號,修改該員工工資。如果該員工工資低于1000,則工資增加200;如果工資在10002000之間,則增加150;如果工資在20003000之間,則增加100;否則增加50。 Oracle10g 數據庫基礎教程77pDECLAREpv_sal emp.sal%type;pv_increment NUMBER(4);pv_empno emp.empno%type;pBEGINpv_empno:=&x;pSELECT sal INTO v_sal FROM emp p WHERE empno=
49、v_empno;pCASE p WHEN v_sal1000 THEN v_increment:=200;p WHEN v_sal2000 THEN v_increment:=150;p WHEN v_sal 50;p END LOOP;pEND; Oracle10g 數據庫基礎教程83(2)WHILE循環循環p基本語法pWHILE condition LOOP p sequence_of_statement;pEND LOOP; Oracle10g 數據庫基礎教程84p利用WHILE循環向temp_table表中插入50條記錄。pDECLAREp v_counter BINARY_INTEG
50、ER :=1;pBEGINp WHILE v_counter = 50 LOOPp INSERT INTO temp_table VALUES (v_counter, Loop index);p v_counter := v_counter + 1;p END LOOP;pEND; Oracle10g 數據庫基礎教程85(3)FOR循環循環p基本語法pFOR loop_counter IN REVERSE p low_bound.high_boundpLOOPp sequence_of_statement;pEND LOOP;p注意:p循環變量不需要顯式定義,系統隱含地將它聲明為BINARY_
51、INTEGER變量;p系統默認時,循環變量從下界往上界遞增計數,如果使用REVERSE關鍵字,則表示循環變量從上界向下界遞減計數;p循環變量只能在循環體中使用,不能在循環體外使用。Oracle10g 數據庫基礎教程86p利用FOR循環向temp_table表中插入50條記錄。pBEGINp FOR v_counter IN 1.50 LOOPp INSERT INTO temp_table VALUES (v_counter, Loop Index);p END LOOP;pEND;Oracle10g 數據庫基礎教程8714.3.3跳轉結構跳轉結構p語法格式:p標號p p GOTO 標號;p說
52、明:p塊內可以跳轉,內層塊可以跳到外層塊,但外層塊不能跳到內層。pIF語句不能跳入。不能從循環體外跳入循環體內。不能從子程序外部跳到子程序中。p由于goto語句的缺點,建議盡量少用甚至不用goto語句。 Oracle10g 數據庫基礎教程88pDECLAREp v_counter BINARY_INTEGER :=1;pBEGINp p INSERT INTO temp_table VALUES (v_counter, Loop index);p v_counter := v_Counter + 1;p IF v_counter(p SELECT AVG(sal) FROM emp WHERE
53、 deptno=10);p ELSIF v_table = dept THENp OPEN v_cursor FOR SELECT deptno,count(*) num p FROM emp GROUP BY deptno;p ELSEp RAISE_APPLICATION_ERROR(-20000,Input must be p emp or dept);p END IF; Oracle10g 數據庫基礎教程131p LOOPp IF v_table = emp THENp FETCH v_cursor INTO v_emp;p EXIT WHEN v_cursor%NOTFOUND;p
54、DBMS_OUTPUT.PUT_LINE(v_emp.empno| | p v_emp.ename| | p v_emp.sal| |p v_emp.deptno);p ELSEp FETCH v_cursor INTO v_deptno,v_num;p EXIT WHEN v_cursor%NOTFOUND;p DBMS_OUTPUT.PUT_LINE(v_deptno| |v_num);p END IF;p END LOOP;p CLOSE v_cursor;pEND; Oracle10g 數據庫基礎教程13214.5 異常處理異常處理p異常概述p異常處理過程 p異常的傳播Oracle10
55、g 數據庫基礎教程13314.5.1 異常概述異常概述pOracle錯誤處理機制p異常的類型Oracle10g 數據庫基礎教程134(1) Oracle錯誤處理機制錯誤處理機制pOracle中對運行時錯誤的處理采用了異常處理機制。 p一個錯誤對應一個異常,當錯誤產生時拋出相應的異常,并被異常處理器捕獲,程序控制權傳遞給異常處理器,由異常處理器來處理運行時錯誤。 Oracle10g 數據庫基礎教程135(2)異常的類型)異常的類型p預定義的Oracle異常( Oracle錯誤)p非預定義的Oracle異常( Oracle錯誤)p用戶定義的異常(用戶定義錯誤)Oracle10g 數據庫基礎教程13
56、6p預定義的Oracle異常p當Oracle錯誤產生時,與錯誤對應的預定義異常被自動拋出,通過捕獲該異常可以對錯誤進行處理。p常用預定義異常包括:Oracle10g 數據庫基礎教程137異常情況名錯誤代碼描述CURSOR_ALREADY_OPEN ORA-06511 嘗試打開已經打開的游標 INVALID_CURSORORA-01001不合法的游標操作(如要打開已經關閉的游標) NO_DATA_FOUNDORA-01403沒有發現數據 TOO_MANY_ROWSORA-01422一個SELECT INTO語句匹配多個數據行INVALID_NUMBERORA-01722轉換成數字失敗 (X) V
57、ALUE_ERRORORA-06502截斷、算法或轉換錯誤,通常出現在賦值錯誤 ZERO_DIVIDEORA-01476除數為0 ROWTYPE_MISMATCHORA-06504主機游標變量與PL/SQL游標變量類型不匹配Oracle10g 數據庫基礎教程138異常情況名錯誤代碼描述DUP_VAL_ON_INDEXORA-00001違反唯一性約束或主鍵約束SYS_INVALID_ROWIDORA-01410轉換成ROWID失敗TIMEOUT_ON_RESOURCEORA-00051在等待資源中出現超時LOGIN_DENIEDORA-01017無效用戶名/密碼CASE_NOT_FOUNDORA
58、-06592沒有匹配的WHEN子句NOT_LOGGED_ONORA-01012沒有與數據庫建立連接STORAGE_ERRORORA-06500PL/SQL內部錯誤PROGRAM_ERRORORA-06501PL/SQL內部錯誤Oracle10g 數據庫基礎教程139異常情況名錯誤代碼描述ACCESS_INTO_NULLORA-06530給空對象屬性賦值COLLECTION_IS_NULLORA-06531對某NULL PL/SQL表或可變數組試圖應用集合方法,而不是EXISTS SELF_IS_NULLORA-30625調用空對象實例的方法SUBSCRIPT_BEYOND_COUNTORA-0
59、6533對嵌套表或數組索引引用時超出集合中元素的數量SUBSCRIPT_OUTSIDE_LIMITORA-06532對嵌套表或可變數組索引的引用超出聲明的范圍Oracle10g 數據庫基礎教程140p非預定義異常p有一些Oracle錯誤沒有預定義異常與其關聯,需要在語句塊的聲明部分聲明一個異常名稱,然后通過編譯指示PRAGMA EXCEPTION_INIT將該異常名稱與一個Oracle錯誤相關聯。此后,當執行過程出現該錯誤時將自動拋出該異常。Oracle10g 數據庫基礎教程141p聲明一個異常名稱pe_integrity EXCEPTION;p將異常與一個Oracle錯誤號相綁定pPRAGM
60、A EXCEPTION-INIT(e_integrity.-2291)p示例pDECLAREp e_deptno_fk EXCEPTION;p PRAGMA EXCEPTION_INIT(e_deptno_fk,-2292);pBEGINppEXCEPTIONppEND;Oracle10g 數據庫基礎教程142p用戶自定義的異常p用戶定義錯誤是指,有些操作并不會產生Oracle錯誤,但是從業務規則角度考慮,認為是一種錯誤。p用戶自定義異常必須在聲明部分進行聲明。p當異常發生時,系統不能自動觸發,需要用戶使用RAISE語句。p在異常處理部分捕捉并處理異常。Oracle10g 數據庫基礎教程14314.5.2 異常處理過程異常
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商丘市重點中學2025屆初三下學期第二次段考化學試題試卷含解析
- 蘇州健雄職業技術學院《建筑環境前沿技術》2023-2024學年第二學期期末試卷
- 遼寧省撫順德才高級中學2025年高三高考適應性月考(一)化學試題含解析
- 咸寧職業技術學院《大學體育-乒乓球》2023-2024學年第一學期期末試卷
- 模電 1.3 晶體三極管學習資料
- 內蒙古自治區鄂爾多斯市達標名校2025年初三下學期聯合語文試題含解析
- 南京視覺藝術職業學院《康復體操》2023-2024學年第二學期期末試卷
- 西藏大學《臨床基本技能學2》2023-2024學年第二學期期末試卷
- 清華大學中學2025屆高三下學期第二次質量測試物理試題含解析
- 豫章師范學院《室內專題設計1》2023-2024學年第一學期期末試卷
- 公路過道管更換施工方案
- 創傷急救培訓課件
- 王貴啟-玉米田雜草發生發展及除草劑優解-合肥0728
- 彤輝羅布麻茶
- 20S517 排水管道出水口
- 經尿道前列腺剜除術講解
- 除塵系統和相關安全設施設備運行、維護及檢修、維修管理制度
- 電影音樂欣賞智慧樹知到答案章節測試2023年華南農業大學
- 傳感器原理與應用智慧樹知到答案章節測試2023年山東大學(威海)
- 工程熱力學 09氣體動力循環-wyz-2013
- 情緒管理課:認識情緒-心理健康教育課件
評論
0/150
提交評論