DUP_VAL_ON_INDEX
INVALID_CURSOR
NO_DATA_FOUND
TOO_MANY_ROWS
ZERO_DIVIDE
2.將NO_DATA_FOUND
TOO_MANY_ROWS預定義異常,
修改爲非預定義異常。
3.UPDATE dept
SET deptno = 11
WHERE deptno = 10;
以上語句會產生異常,使用非預定義異常捕獲處理。
1、
create table message(
result varchar2(100));
2、
declare
v_sal emp.sal%type;
v_ename emp.ename%type;
v_num number;
e_none_sal exception;
e_many_sal exception;
pragma exception_init(e_none_sal,-20202);
v_var varchar2(100);
begin
v_sal:=&p_sal;
select count(sal) into v_num
from emp
where sal=v_sal;
if v_num=1 then
select ename into v_ename
from emp
where sal=v_sal;
dbms_output.put_line(v_ename||' '||v_sal);
elsif v_num=0 then
Raise_Application_Error(-20202,'沒有僱員掙'||v_sal||'的薪水');
elsif v_num>1 then
raise e_many_sal;
end if;
exception
when e_none_sal then
v_var := sqlerrm;
dbms_output.put_line(v_var );
insert into message
values(v_var);
when e_many_sal then
dbms_output.put_line('太多僱員掙sal的薪水');
insert into message
values('太多僱員掙sal的薪水');
end;
3、
DECLARE
v_empno emp.empno%TYPE := 7369;
yearlog INT;
BEGIN
SELECT trunc(months_between(SYSDATE,hiredate)/12)
INTO yearlog
FROM emp
WHERE empno = v_empno;
dbms_output.put_line(yearlog);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('此員工號不存在');
END;
4.
DECLARE
v_name emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
SELECT e2.ename,
e2.job
INTO v_name,
v_job
FROM emp e1,
emp e2
WHERE e1.mgr = e2.empno
AND e1.mgr IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('沒有最高管理者');
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('最高管理者人員過多');
END;
5.
declare
CURSOR m_cursor
IS
SELECT deptno,
AVG(sal) AS avgsal
FROM emp
GROUP BY deptno;
e_tohig EXCEPTION;
PRAGMA exception_init(e_tohig,-20001);
begin
FOR r_cur IN m_cursor LOOP
IF r_cur.avgsal >= 15000 THEN
Raise_Application_Error(-20001,'該部門的平均工資過高');
END IF;
END LOOP;
EXCEPTION
WHEN e_tohig THEN
Raise_Application_Error(-20001,'該部門的平均工資過高');
end;