1。控制流程(if,while)
2。循環(for)
3。游標(cursor)
4。異常處理(exception)
1。控制流程()
A.條件語句
IF <statement> THEN
?? PL/SQL
END IF;
IF <statement> THEN
?? PL/SQL
ELSE
?? PL/SQL
END IF;
IF
<statement> THEN
?? PL/SQL
ELSIF <statement> THEN
?? PL/SQL
END IF;
2。循環
A.simple loop
LOOP
?? SQL
?? EXIT WHEN <statement>;
END LOOP;
LOOP
?? SQL
?? IF
<statement>
THEN
?? EXIT;
?? END IF;
END LOOP;
B.While loop
WHILE <statement> LOOP
?? SQL
END LOOP;
C.For loop
FOR $counter in $low .. $high LOOP
?? SQL
END LOOP
3。游標
在PL/SQL程序中定義的游標叫做顯式游標。
A.顯式游標的處理由四個部分組成:
cursor $cursorname is $Query; --定義游標
open $cursorname; --打開游標
fetch $cursorname into $othervariable --把游標中的東西取出
close $cursorname??? --關閉游標
B.游標屬性
%found?? ?? ?? 布爾型屬性,當最近一次讀紀錄成功
時
,為true.
%nofound 失敗時,為false.
%isopen
%rowcount?? ?? 返回已從游標中讀取的記錄數。
C.參數化游標
所有的SQL語句在上下文區內部都是可執行的,因此都有一個游標指向上下文區,此游標就是所謂的SQL游標。
與顯式游標不同,SQL游標不被程序打開和關閉。
4.異常處理概念
異常處理是用來處理正常執行過程中未預料的事件。如果PL/SQL程序塊一旦產生異常而又沒有指出如何處理時,程序會自動終止。
異常處理部分放在PL/SQL的后半部分,結構為:
EXCEPTION
?????? WHEN first_exception THEN <code to handle first exception>
?????? WHEN second_exception THEN <code to handle second exception>
?????? WHEN OTHERS THEN <
code to handle second exception
>? --OTHERS必須放在最后
異常分為預定義和用戶定義兩種。
用戶定義的異常是通過顯式使用RAISE語句來引發。如
DECLARE
? e_TooManyStudents EXCEPTION;? -- 類型為Exception,用于指示錯誤條件
? v_CurrentStudents NUMBER(3);? -- HIS-101學生注冊當前號
? v_MaxStudents NUMBER(3);????? -- HIS-101學生注冊允許的最大號
BEGIN
/* 找出注冊學生當前號和允許的最大號 */
? SELECT current_students, max_students
??? INTO v_CurrentStudents, v_MaxStudents
??? FROM classes
??? WHERE department = 'HIS' AND course = 101;
? /* 檢查學生的號 */
? IF v_CurrentStudents > v_MaxStudents THEN
/* 太多的學生注冊,則觸發例外處理 */
? RAISE e_TooManyStudents;
? END IF;
EXCEPTION
? WHEN e_TooManyStudents THEN
??? /* 當太多的學生注冊,就插入信息解釋發生過錯誤 */
??? INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||
????? 'students: max allowed is ' || v_MaxStudents);
END;
END;
用戶定義的的異常處理
可以使用RAISE_APPLICATION_ERROR來創建自己的錯誤處理:
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
其中 error_number是從-20000到-20999之間的參數; error_message是相應的提示信息,小于512字節。如:
CREATE OR REPLACE PROCEDURE Register (
p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) AS
v_CurrentStudents NUMBER;? -- 班上學生的當前號
v_MaxStudents NUMBER;????? -- 班上學生的最大號
BEGIN
/* 找出學生的當前號和最大號 */
SELECT current_students, max_students
?INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE course = p_Course
AND department = p_Department;
/*
確認另外的學生是否有足夠的教室
*/
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
p_Department || ' ' || p_Course);
END IF;
/*
加一個學生在本班
*/
ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
??? ?? ?? ' doesn''t exist!');
END Register;