寫(xiě)一些關(guān)于PL/SQL的語(yǔ)法,免得等到用到的時(shí)候還要去亂翻。 1。控制流程(if,while) 2。循環(huán)(for) 3。游標(biāo)(cursor) 4。異常處理(exception) 1。控制流程() A.條件語(yǔ)句 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。循環(huán) 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。游標(biāo) 在PL/SQL程序中定義的游標(biāo)叫做顯式游標(biāo)。 A.顯式游標(biāo)的處理由四個(gè)部分組成: cursor $cursorname is $Query; --定義游標(biāo) open $cursorname; --打開(kāi)游標(biāo) fetch $cursorname into $othervariable --把游標(biāo)中的東西取出 close $cursorname --關(guān)閉游標(biāo) B.游標(biāo)屬性 %found 布爾型屬性,當(dāng)最近一次讀紀(jì)錄成功時(shí),為true. %nofound 失敗時(shí),為false. %isopen %rowcount 返回已從游標(biāo)中讀取的記錄數(shù)。 C.參數(shù)化游標(biāo) 所有的SQL語(yǔ)句在上下文區(qū)內(nèi)部都是可執(zhí)行的,因此都有一個(gè)游標(biāo)指向上下文區(qū),此游標(biāo)就是所謂的SQL游標(biāo)。 與顯式游標(biāo)不同,SQL游標(biāo)不被程序打開(kāi)和關(guān)閉。 4.異常處理概念 異常處理是用來(lái)處理正常執(zhí)行過(guò)程中未預(yù)料的事件。如果PL/SQL程序塊一旦產(chǎn)生異常而又沒(méi)有指出如何處理時(shí),程序會(huì)自動(dòng)終止。 異常處理部分放在PL/SQL的后半部分,結(jié)構(gòu)為: 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必須放在最后 異常分為預(yù)定義和用戶(hù)定義兩種。 用戶(hù)定義的異常是通過(guò)顯式使用RAISE語(yǔ)句來(lái)引發(fā)。如 DECLARE e_TooManyStudents EXCEPTION; -- 類(lèi)型為Exception,用于指示錯(cuò)誤條件 v_CurrentStudents NUMBER(3); -- HIS-101學(xué)生注冊(cè)當(dāng)前號(hào) v_MaxStudents NUMBER(3); -- HIS-101學(xué)生注冊(cè)允許的最大號(hào) BEGIN /* 找出注冊(cè)學(xué)生當(dāng)前號(hào)和允許的最大號(hào) */ SELECT current_students, max_students INTO v_CurrentStudents, v_MaxStudents FROM classes WHERE department = 'HIS' AND course = 101; /* 檢查學(xué)生的號(hào) */ IF v_CurrentStudents > v_MaxStudents THEN /* 太多的學(xué)生注冊(cè),則觸發(fā)例外處理 */ RAISE e_TooManyStudents; END IF; EXCEPTION WHEN e_TooManyStudents THEN /* 當(dāng)太多的學(xué)生注冊(cè),就插入信息解釋發(fā)生過(guò)錯(cuò)誤 */ INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents || 'students: max allowed is ' || v_MaxStudents); END; END; 用戶(hù)定義的的異常處理 可以使用RAISE_APPLICATION_ERROR來(lái)創(chuàng)建自己的錯(cuò)誤處理: RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]); 其中error_number是從-20000到-20999之間的參數(shù);error_message是相應(yīng)的提示信息,小于512字節(jié)。如: 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; -- 班上學(xué)生的當(dāng)前號(hào) v_MaxStudents NUMBER; -- 班上學(xué)生的最大號(hào) BEGIN /* 找出學(xué)生的當(dāng)前號(hào)和最大號(hào) */ SELECT current_students, max_students INTO v_CurrentStudents, v_MaxStudents FROM classes WHERE course = p_Course AND department = p_Department; /* 確認(rèn)另外的學(xué)生是否有足夠的教室*/ IF v_CurrentStudents + 1 > v_MaxStudents THEN RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' || p_Department || ' ' || p_Course); END IF; /* 加一個(gè)學(xué)生在本班 */ 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; | |