七歲那年趾撵,我抓到一只蟬屎勘;就以為能抓住整個(gè)夏天
異常處理:就是當(dāng)發(fā)現(xiàn)異常出現(xiàn)涎嚼,則捕獲提示
預(yù)定義的 Oracle 異常,有異常名挑秉,有錯(cuò)誤代碼法梯,有異常信息。
非預(yù)定義的 Oracle 異常犀概,有錯(cuò)誤代碼立哑,有異常信息,但是沒有異常名字姻灶。
在實(shí)際開發(fā)中铛绰,我們的異常處理,一般情況下都是需要使用 Java 代碼方式來處理产喉。因?yàn)槲覀儗W(xué)習(xí)的 Java 語言是面向?qū)ο蟮?/p>
Oracle 數(shù)據(jù)庫其實(shí)是一個(gè)關(guān)系型數(shù)據(jù)庫捂掰,如果要操作的話,太麻煩了曾沈。
C 面向過程:步驟需要詳細(xì)到每一步这嚣,所有的資源釋放都要自己來。
-
Java 面向?qū)ο螅核械臉I(yè)務(wù)邏輯塞俱,交給對應(yīng)的對象去執(zhí)行姐帚。
declare vid int; vname varchar(2); begin select id, name into vid, vname from tb_stuu; dbms_output.put_line('vid 的值:' || vid ); dbms_output.put_line('vname 的值:' || vname ); exception when too_many_rows then dbms_output.put_line('如果有太多數(shù)據(jù)返回'); when no_data_found then dbms_output.put_line('找不到對應(yīng)的數(shù)據(jù)'); when others then dbms_output.put_line('其實(shí)我也懵的..愿主保佑你'); end;
自定義異常
declare
myexcption exception;
begin
dbms_output.put_line('------ 前 ------');
-- 制造一個(gè)異常
raise myexcption;
dbms_output.put_line('------ 后 ------');
實(shí)現(xiàn)異常
exception
when myexcption then
dbms_output.put_line('不要緊張,這個(gè)是自己做的異常..無毒的');
when others then
dbms_output.put_line('這個(gè)有可能是有毒的哦...');
end;
一般情況下障涯,我們在開發(fā)捕獲異常時(shí)罐旗,需要關(guān)系幾個(gè)點(diǎn)
什么異常?主要根據(jù)名字做初步判斷唯蝶。
什么時(shí)候報(bào)的九秀?看一下,最近有沒有哪個(gè)模塊發(fā)生改動(dòng)粘我,快速定位鼓蜒。
具體信息是什么?根據(jù)詳細(xì)信息推斷出問題所在涂滴,及時(shí)修復(fù)友酱。
創(chuàng)建一張表,來收集異常信息
create table tb_error (
id int primary key,
errorObject varchar(100),
errorCode varchar(100),
errorMsg varchar(200),
errorDate date
);
創(chuàng)建序列
-- %ROWTYPE:用于給變量賦值對應(yīng)的類型柔纵,
-- 相當(dāng)于 User user = new User();中給 user 變量賦值的作用
create sequence error_seq;
select * from tb_error;
declare
vstuu tb_stuu%ROWTYPE; -- tb_stuu 表的變量
vmsg varchar(200); -- 異常信息
vcode varchar(100); -- 異常編碼
begin
如果我們查詢一條不存在的記錄缔杉,則報(bào)錯(cuò)
select * into vstuu from tb_stuu where id = 5;
dbms_output.put_line('查詢到的名字是:' || vstuu.name);
exception
when others then
vcode := sqlcode;
vmsg := sqlerrm;
如果發(fā)生異常的話,則需要往 tb_error 表中插入數(shù)據(jù)
insert into tb_error(id, errorobject, errorcode, errormsg, errordate)
values (error_seq.nextval, 'exceptionName', vcode, vmsg, sysdate);
commit;
end;