版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、-存儲(chǔ)過(guò)程的定義 默認(rèn)inCreate or Replace Procedure 過(guò)程名(變量名 in,out,inout 數(shù)據(jù)類(lèi)型) is,as-自定義變量Begin End 過(guò)程名;-自定義函數(shù)的定義 默認(rèn)inCreate or Replace Function 函數(shù)名(變量名 in,out,inout 數(shù)據(jù)類(lèi)型)Return 數(shù)據(jù)類(lèi)型 is,as自定義變量Begin Return 值;End 函數(shù)名;Create function XXX(saljia number) return numberAsBegin Sal+20endselect XXX(sal) from emp;函數(shù)調(diào)用限
2、制1、SQL語(yǔ)句中只能調(diào)用函數(shù)2、SQL只能調(diào)用帶有輸入?yún)?shù),不能帶有輸出,輸入輸出函數(shù)3、SQL不能使用PL/SQL的特有數(shù)據(jù)類(lèi)型(boolean,table,record等)4、SQL語(yǔ)句中調(diào)用的函數(shù)不能包含INSERT,UPDATE和DELETE語(yǔ)句異常錯(cuò)誤處理 一個(gè)優(yōu)秀的程序都應(yīng)該能夠正確處理各種出錯(cuò)情況,并盡可能從錯(cuò)誤中恢復(fù)。ORACLE 提供異常情況(EXCEPTION)和異常處理(EXCEPTION HANDLER)來(lái)實(shí)現(xiàn)錯(cuò)誤處理。1.1 異常處理概念異常情況處理(EXCEPTION)是用來(lái)處理正常執(zhí)行過(guò)程中未預(yù)料的事件,程序塊的異常處理預(yù)定義的錯(cuò)誤和自定義錯(cuò)誤,由于PL/SQL
3、程序塊一旦產(chǎn)生異常而沒(méi)有指出如何處理時(shí),程序就會(huì)自動(dòng)終止整個(gè)程序運(yùn)行.有三種類(lèi)型的異常錯(cuò)誤:1 預(yù)定義 ( Predefined )錯(cuò)誤ORACLE預(yù)定義的異常情況大約有24個(gè)。對(duì)這種異常情況的處理,無(wú)需在程序中定義,由ORACLE自動(dòng)將其引發(fā)。2 非預(yù)定義 ( Predefined )錯(cuò)誤即其他標(biāo)準(zhǔn)的ORACLE錯(cuò)誤。對(duì)這種異常情況的處理,需要用戶(hù)在程序中定義,然后由ORACLE自動(dòng)將其引發(fā)。3 用戶(hù)定義(User_define) 錯(cuò)誤程序執(zhí)行過(guò)程中,出現(xiàn)編程人員認(rèn)為的非正常情況。對(duì)這種異常情況的處理,需要用戶(hù)在程序中定義,然后顯式地在程序中將其引發(fā)。異常處理部分一般放在 PL/SQL 程序
4、體的后半部,結(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 others exception >END;異常處理可以按任意次序排列,但 OTHERS 必須放在最后.1.1.1 §5.1.1 預(yù)定義的異常處理預(yù)定義說(shuō)明的部分 ORACLE 異常錯(cuò)誤錯(cuò)誤號(hào)異常錯(cuò)誤信息
5、名稱(chēng)說(shuō)明ORA-0001Dup_val_on_index試圖破壞一個(gè)唯一性限制ORA-0051Timeout-on-resource在等待資源時(shí)發(fā)生超時(shí)ORA-0061Transaction-backed-out由于發(fā)生死鎖事務(wù)被撤消ORA-1001Invalid-CURSOR試圖使用一個(gè)無(wú)效的游標(biāo)ORA-1012Not-logged-on沒(méi)有連接到ORACLEORA-1017Login-denied無(wú)效的用戶(hù)名/口令ORA-1403No_data_foundSELECT INTO沒(méi)有找到數(shù)據(jù)ORA-1422Too_many_rowsSELECT INTO 返回多行ORA-1476Zero-d
6、ivide試圖被零除ORA-1722Invalid-NUMBER轉(zhuǎn)換一個(gè)數(shù)字失敗ORA-6500Storage-error內(nèi)存不夠引發(fā)的內(nèi)部錯(cuò)誤ORA-6501Program-error內(nèi)部錯(cuò)誤ORA-6502Value-error轉(zhuǎn)換或截?cái)噱e(cuò)誤ORA-6504Rowtype-mismatch縮主游標(biāo)變量與 PL/SQL變量有不兼容行類(lèi)型ORA-6511CURSOR-already-OPEN試圖打開(kāi)一個(gè)已存在的游標(biāo)ORA-6530Access-INTO-null試圖為null 對(duì)象的屬性賦值ORA-6531Collection-is-null試圖將Exists 以外的集合( collectio
7、n)方法應(yīng)用于一個(gè)null pl/sql 表上或varray上ORA-6532Subscript-outside-limit對(duì)嵌套或varray索引得引用超出聲明范圍以外ORA-6533Subscript-beyond-count對(duì)嵌套或varray 索引得引用大于集合中元素的個(gè)數(shù). 對(duì)這種異常情況的處理,只需在PL/SQL塊的異常處理部分,直接引用相應(yīng)的異常情況名,并對(duì)其完成相應(yīng)的異常錯(cuò)誤處理即可。例1:更新指定員工工資,如工資小于1500,則加100;DECLARE v_empno emp.empno%TYPE :=&empno; v_sal emp.sal%TYPE;BEGIN
8、SELECT sal INTO v_sal FROM emp WHERE empno=v_empno; IF v_sal<=1500 THEN UPDATE emp SET sal=sal+100 WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE('編碼為'|v_empno|'員工工資已更新!'); ELSEDBMS_OUTPUT.PUT_LINE('編碼為'|v_empno|'員工工資已經(jīng)超過(guò)規(guī)定值!'); END IF;EXCEPTION WHEN NO_DATA_FOUND THEN
9、DBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫(kù)中沒(méi)有編碼為'|v_empno|'的員工'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('程序運(yùn)行錯(cuò)誤!請(qǐng)使用游標(biāo)'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('發(fā)生其它錯(cuò)誤!');END;1.1.2 非預(yù)定義的異常處理對(duì)于這類(lèi)異常情況的處理,首先必須對(duì)非定義的ORACLE錯(cuò)誤進(jìn)行定義。步驟如下:1. 在PL/SQL 塊的定義部分定義異常情況:<異常情況> EXCEPTION;2.
10、將其定義好的異常情況,與標(biāo)準(zhǔn)的ORACLE錯(cuò)誤聯(lián)系起來(lái),使用EXCEPTION_INIT語(yǔ)句:PRAGMA EXCEPTION_INIT(<異常情況>, <錯(cuò)誤代碼>);3. 在PL/SQL 塊的異常情況處理部分對(duì)異常情況做出相應(yīng)的處理。例2:刪除指定部門(mén)的記錄信息,以確保該部門(mén)沒(méi)有員工。INSERT INTO dept VALUES(50, FINANCE, CHICAGO);DECLARE v_deptno dept.deptno%TYPE :=&deptno; e_deptno_remaining EXCEPTION; PRAGMA EXCEPTION_I
11、NIT(e_deptno_remaining, -2292); /* -2292 是違反一致性約束的錯(cuò)誤代碼 */BEGIN DELETE FROM dept WHERE deptno=v_deptno;EXCEPTION WHEN e_deptno_remaining THEN DBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完整性約束!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('發(fā)生其它錯(cuò)誤!');END; 1.1.3 用戶(hù)自定義的異常處理當(dāng)與一個(gè)異常錯(cuò)誤相關(guān)的錯(cuò)誤出現(xiàn)時(shí),就會(huì)隱含觸發(fā)該異常錯(cuò)誤。用戶(hù)定義的異常錯(cuò)
12、誤是通過(guò)顯式使用 RAISE 語(yǔ)句來(lái)觸發(fā)。當(dāng)引發(fā)一個(gè)異常錯(cuò)誤時(shí),控制就轉(zhuǎn)向到 EXCEPTION塊異常錯(cuò)誤部分,執(zhí)行錯(cuò)誤處理代碼。對(duì)于這類(lèi)異常情況的處理,步驟如下:1 在PL/SQL 塊的定義部分定義異常情況:<異常情況> EXCEPTION;2 RAISE <異常情況>;3 在PL/SQL 塊的異常情況處理部分對(duì)異常情況做出相應(yīng)的處理。例3:更新指定員工工資,增加100;DECLARE v_empno emp.empno%TYPE :=&empno; no_result EXCEPTION;BEGIN UPDATE emp SET sal=sal+100 WH
13、ERE empno=v_empno; IF SQL%NOTFOUND THEN RAISE no_result; END IF;EXCEPTION WHEN no_result THEN DBMS_OUTPUT.PUT_LINE('你的數(shù)據(jù)更新語(yǔ)句失敗了!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('發(fā)生其它錯(cuò)誤!');END;1.1.4 用戶(hù)定義的異常處理調(diào)用DBMS_STANDARD(ORACLE提供的包)包所定義的RAISE_APPLICATION_ERROR過(guò)程,可以重新定義異常錯(cuò)誤消息,它為應(yīng)用程序提供了一種與O
14、RACLE交互的方法。RAISE_APPLICATION_ERROR 的語(yǔ)法如下:RAISE_APPLICATION_ERROR(error_number,error_message,keep_errors ) ;這里的error_number 是從 20,000 到 20,999 之間的參數(shù), error_message 是相應(yīng)的提示信息(< 2048 字節(jié)),keep_errors 為可選,如果keep_errors =TRUE ,則新錯(cuò)誤將被添加到已經(jīng)引發(fā)的錯(cuò)誤列表中。如果keep_errors=FALSE(缺省),則新錯(cuò)誤將替換當(dāng)前的錯(cuò)誤列表。例4:創(chuàng)建一個(gè)函數(shù)get_salar
15、y, 該函數(shù)檢索指定部門(mén)的工資總和,其中定義了-20991和-20992號(hào)錯(cuò)誤,分別處理參數(shù)為空和非法部門(mén)代碼兩種錯(cuò)誤:CREATE TABLE errlog(Errcode NUMBER,Errtext CHAR(40);CREATE OR REPLACE FUNCTION get_salary (p_deptno NUMBER)RETURN NUMBER ASV_sal NUMBER;BEGINIF p_deptno IS NULL THENRAISE_APPLICATION_ERROR(-20991, 部門(mén)代碼為空);ELSIF p_deptno<0 THENRAISE_APPLI
16、CATION_ERROR(-20992, 無(wú)效的部門(mén)代碼);ELSESELECT SUM(sal) INTO v_sal FROM EMP WHERE deptno=p_deptno;RETURN V_sal;END IF;END;DECLARE V_salary NUMBER(7,2);V_sqlcode NUMBER;V_sqlerr VARCHAR2(512);Null_deptno EXCEPTION;Invalid_deptno EXCEPTION;PRAGMA EXCEPTION_INIT(null_deptno,-20991);PRAGMA EXCEPTION_INIT(inva
17、lid_deptno, -20992);BEGINV_salary :=get_salary(10);DBMS_OUTPUT.PUT_LINE(10號(hào)部門(mén)工資:|TO_CHAR(V_salary);BEGINV_salary :=get_salary(-10);EXCEPTIONWHEN invalid_deptno THENV_sqlcode :=SQLCODE;V_sqlerr :=SQLERRM;INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr);COMMIT;END inner1;V_salary :=get
18、_salary(20);DBMS_OUTPUT.PUT_LINE(20號(hào)部門(mén)工資:|TO_CHAR(V_salary);BEGINV_salary :=get_salary(NULL);END inner2;V_salary :=get_salary(30);DBMS_OUTPUT.PUT_LINE(30號(hào)部門(mén)工資:|TO_CHAR(V_salary);EXCEPTIONWHEN null_deptno THENV_sqlcode :=SQLCODE;V_sqlerr :=SQLERRM;INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode
19、, v_sqlerr);COMMIT;WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('發(fā)生其它錯(cuò)誤!');END outer;1.2 異常錯(cuò)誤傳播 由于異常錯(cuò)誤可以在聲明部分和執(zhí)行部分以及異常錯(cuò)誤部分出現(xiàn),因而在不同部分引發(fā)的異常錯(cuò)誤也不一樣。1.2.1 在執(zhí)行部分引發(fā)異常錯(cuò)誤 當(dāng)一個(gè)異常錯(cuò)誤在執(zhí)行部分引發(fā)時(shí),有下列情況:l 如果當(dāng)前塊對(duì)該異常錯(cuò)誤設(shè)置了處理,則執(zhí)行它并成功完成該塊的執(zhí)行,然后控制轉(zhuǎn)給包含塊。l 如果沒(méi)有對(duì)當(dāng)前塊異常錯(cuò)誤設(shè)置定義處理器,則通過(guò)在包含塊中引發(fā)它來(lái)傳播異常錯(cuò)誤。然后對(duì)該包含塊執(zhí)行步驟1)。1.2.2 在聲明部分引發(fā)異常錯(cuò)誤
20、 如果在聲明部分引起異常情況,即在聲明部分出現(xiàn)錯(cuò)誤,那么該錯(cuò)誤就能影響到其它的塊。比如在有如下的PL/SQL程序:DECLAREAbc number(3):=abc;其它語(yǔ)句BEGIN其它語(yǔ)句EXCEPTIONWHEN OTHERS THEN 其它語(yǔ)句END;例子中,由于Abc number(3)=abc; 出錯(cuò),盡管在EXCEPTION中說(shuō)明了WHEN OTHERS THEN語(yǔ)句,但WHEN OTHERS THEN也不會(huì)被執(zhí)行。 但是如果在該錯(cuò)誤語(yǔ)句塊的外部有一個(gè)異常錯(cuò)誤,則該錯(cuò)誤能被抓住,如:BEGINDECLAREAbc number(3):=abc;其它語(yǔ)句 BEGIN其它語(yǔ)句 EXC
21、EPTIONWHEN OTHERS THEN 其它語(yǔ)句END;EXCEPTIONWHEN OTHERS THEN 其它語(yǔ)句END;1.3 異常錯(cuò)誤處理編程 在一般的應(yīng)用處理中,建議程序人員要用異常處理,因?yàn)槿绻绦蛑胁宦暶魅魏萎惓L幚恚瑒t在程序運(yùn)行出錯(cuò)時(shí),程序就被終止,并且也不提示任何信息。下面是使用系統(tǒng)提供的異常來(lái)編程的例子。1.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 由于ORACLE 的錯(cuò)信息最大長(zhǎng)度是512字節(jié),為了得到完整的錯(cuò)誤提示信息,我們可用 SQLERRM和 SUBSTR 函數(shù)一起得到錯(cuò)誤提示信息。SQLCODE 返回錯(cuò)誤代碼數(shù)字.SQLERRM 返回錯(cuò)誤信息.如: SQLCODE=+100 è SQLER
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年海南省安全員知識(shí)題庫(kù)
- 2025年貴州省安全員C證考試(專(zhuān)職安全員)題庫(kù)附答案
- 中醫(yī)內(nèi)科學(xué)-癭病
- 【大學(xué)課件】建筑設(shè)備工程
- 聲音的產(chǎn)生與傳播+flash課件
- 語(yǔ)文課件-畫(huà)蛇添足
- 三年級(jí)語(yǔ)文《炮手》課件
- 建設(shè)工程安全生產(chǎn)管理課件
- 萬(wàn)科穿插施工與施工計(jì)劃
- 《急腹癥幻燈》課件
- 2024年航空職業(yè)技能鑒定考試-航空乘務(wù)員危險(xiǎn)品考試近5年真題附答案
- 強(qiáng)制執(zhí)行解除申請(qǐng)書(shū)模板
- 小流域水土保持綜合治理工程施工方案
- 佳能-6D-相機(jī)說(shuō)明書(shū)
- 第五單元《圓》(大單元教學(xué)設(shè)計(jì))-2024-2025學(xué)年六年級(jí)上冊(cè)數(shù)學(xué)人教版
- 商業(yè)道德和反腐敗制度
- 2025屆新高考英語(yǔ)熱點(diǎn)沖刺復(fù)習(xí)語(yǔ)法填空
- 水利工程土方回填施工方案
- 宜昌市西陵區(qū)2024年數(shù)學(xué)六年級(jí)第一學(xué)期期末檢測(cè)試題含解析
- 樂(lè)器維修保養(yǎng)行業(yè)三年發(fā)展洞察報(bào)告
- 中儲(chǔ)糧社招考試題庫(kù)
評(píng)論
0/150
提交評(píng)論