例外
- 例外是程序設(shè)計(jì)語(yǔ)言提供的一種功能凌外,用來(lái)增強(qiáng)程序的健壯性和容錯(cuò)性螺男。
ORACLE 中的例外
系統(tǒng)例外
自定義例外
系統(tǒng)例外
- No_data_found (沒(méi)有找到數(shù)據(jù))
- Too_many_rows (select..into語(yǔ)句匹配多個(gè)行)
- Zero_Divide (被零除)
- Value_error (算術(shù)或轉(zhuǎn)換錯(cuò)誤)
- Timeout_on_resource (在等待資源時(shí)發(fā)生超時(shí))
No_data_found 案例
--系統(tǒng)例外:no_data_found
SET SERVEROUTPUT ON
DECLARE
pe_first_name EMPLOYEES.FIRST_NAME%TYPE;
pe_last_name EMPLOYEES.LAST_NAME%TYPE;
BEGIN
--查詢員工號(hào)是1234的員工姓名
select first_name,last_name into pe_first_name,pe_last_name from EMPLOYEES where EMPLOYEE_ID=1234;
exception
when no_data_found then DBMS_OUTPUT.PUT_LINE('沒(méi)有找到該員工');
when others then DBMS_OUTPUT.PUT_LINE('其他例外');
end;
/
Too_many_rows 案例
--系統(tǒng)例外:too_many_rows
SET SERVEROUTPUT ON
DECLARE
--定義變量
pe_first_name EMPLOYEES.FIRST_NAME%TYPE;
pe_last_name EMPLOYEES.LAST_NAME%TYPE;
BEGIN
select first_name,last_name into pe_first_name,pe_last_name from EMPLOYEES where DEPARTMENT_ID=60;
exception
when too_many_rows then DBMS_OUTPUT.PUT_LINE('selectinto 匹配了多行');
when others then DBMS_OUTPUT.PUT_LINE('其他例外');
end;
/
Zero_Divide 案例
--系統(tǒng)例外:被0除 zero_divide
SET SERVEROUTPUT ON
DECLARE
--定義變量
pnum number;
BEGIN
pnum := 1/0;
exception
when zero_divide then DBMS_OUTPUT.PUT_LINE('1:0不能做除數(shù)');
DBMS_OUTPUT.PUT_LINE('2:0不能做除數(shù)');
when others then DBMS_OUTPUT.PUT_LINE('其他例外');
end;
/
value_error 案例
--系統(tǒng)例外:value_error
SET SERVEROUTPUT ON
DECLARE
--定義變量
pnum number;
BEGIN
pnum := 'abc';
exception
when value_error then DBMS_OUTPUT.PUT_LINE('算術(shù)或者轉(zhuǎn)換錯(cuò)誤');
when others then DBMS_OUTPUT.PUT_LINE('其他例外');
end;
/
自定義例外
- 定義變量干签,類型是exception
- 使用raise拋出自定義例外
--自定義例外:查詢50號(hào)部門(mén)的員工的姓名
SET SERVEROUTPUT ON
DECLARE
--定義光標(biāo)及刻,代表50號(hào)部門(mén)的員工姓名
cursor cemp is select first_name,last_name from EMPLOYEES where DEPARTMENT_ID = 300;
pe_first_name EMPLOYEES.first_name%type;
pe_last_name EMPLOYEES.LAST_NAME%TYPE;
--自定義例外
no_emp_found EXCEPTION;
BEGIN
--打開(kāi)光標(biāo)
open cemp;
--直接取一個(gè)員工的姓名
FETCH cemp into pe_first_name,pe_last_name;
if cemp%notfound then
--拋出例外
raise no_emp_found;
end if;
--關(guān)閉光標(biāo)
--oracle會(huì)自動(dòng)啟動(dòng)pmon(process monitor) 關(guān)閉光標(biāo)
close cemp;
exception
when no_emp_found then DBMS_OUTPUT.PUT_LINE('沒(méi)有找到員工');
when others then DBMS_OUTPUT.PUT_LINE('其他例外');
end;
/