寫一些關于PL/SQL的語法,免得等到用到的時候還要去亂翻。 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; | |