【Oracle強化】⑤第五章 異常處理

1.嘗試捕獲並處理以下異常:
   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;


發佈了56 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章