04-异常处理机制


  1 --[预定义异常]
  2 declare
  3 
  4   v_sal employees.salary%type;
  5 begin
  6   select salary into v_sal
  7   from employees
  8   where employee_id >100;
  9   
 10   dbms_output.put_line(v_sal);
 11 
 12 exception
 13   when Too_many_rows then dbms_output.put_line('输出的行数太多了');
 14 end;
 15 
 16 --[非预定义异常]
 17 declare
 18 
 19   v_sal employees.salary%type;
 20   --声明一个异常
 21   delete_mgr_excep exception;
 22   --把自定义的异常和oracle的错误关联起来
 23   PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
 24 begin
 25   delete from employees
 26   where employee_id = 100;
 27   
 28   select salary into v_sal
 29   from employees
 30   where employee_id >100;
 31   
 32   dbms_output.put_line(v_sal);
 33 
 34 exception
 35   when Too_many_rows then dbms_output.put_line('输出的行数太多了');
 36   when delete_mgr_excep then dbms_output.put_line('Manager不能直接被删除');
 37 end;
 38 
 39 --[用户自定义异常]
 40 declare
 41 
 42   v_sal employees.salary%type;
 43   --声明一个异常
 44   delete_mgr_excep exception;
 45   --把自定义的异常和oracle的错误关联起来
 46   PRAGMA EXCEPTION_INIT(delete_mgr_excep,-2292);
 47   
 48   --声明一个异常
 49   too_high_sal exception;
 50 begin
 51 
 52   select salary into v_sal
 53   from employees
 54   where employee_id =100;
 55   
 56   if v_sal > 1000 then
 57      raise too_high_sal;
 58   end if;
 59      
 60   delete from employees
 61   where employee_id = 100;
 62 
 63   dbms_output.put_line(v_sal);
 64 
 65 exception
 66   when Too_many_rows then dbms_output.put_line('输出的行数太多了');
 67   when delete_mgr_excep then dbms_output.put_line('Manager不能直接被删除');
 68   --处理异常
 69   when too_high_sal then dbms_output.put_line('工资过高了');
 70 end;
 71 
 72 --18. 异常的基本程序: 
 73 通过 select ... into ... 查询某人的工资, 若没有查询到, 则输出 "未找到数据"
 74 
 75 declare
 76   --定义一个变量
 77   v_sal employees.salary%type;
 78 begin
 79   --使用 select ... into ... 为 v_sal 赋值
 80   select salary into v_sal from employees where employee_id = 1000;
 81   dbms_output.put_line('salary: ' || v_sal);
 82 exception
 83   when No_data_found then 
 84        dbms_output.put_line('未找到数据');
 85 end;
 86 
 87 或
 88 
 89 declare
 90   --定义一个变量
 91   v_sal employees.salary%type;
 92 begin
 93   --使用 select ... into ... 为 v_sal 赋值
 94   select salary into v_sal from employees;
 95   dbms_output.put_line('salary: ' || v_sal);
 96 exception
 97   when No_data_found then 
 98        dbms_output.put_line('未找到数据!');
 99   when Too_many_rows then 
100        dbms_output.put_line('数据过多!');     
101 end;
102 
103 --19. 更新指定员工工资,如工资小于300,则加100;对NO_DATA_FOUND 异常, TOO_MANY_ROWS 进行处理.
104 declare
105    v_sal employees.salary%type;
106 begin
107    select salary into v_sal from employees where employee_id = 100;
108    
109    if(v_sal < 300) then update employees set salary = salary + 100 where employee_id = 100;
110    else dbms_output.put_line('工资大于300');
111    end if;
112 exception
113    when no_data_found then dbms_output.put_line('未找到数据');
114     when too_many_rows then dbms_output.put_line('输出的数据行太多');
115 end;
116 
117 --20. 处理非预定义的异常处理: "违反完整约束条件"
118 
119 declare
120   --1. 定义异常    
121   temp_exception exception;
122 
123   --2. 将其定义好的异常情况,与标准的 ORACLE 错误联系起来,使用 EXCEPTION_INIT 语句
124   PRAGMA EXCEPTION_INIT(temp_exception, -2292);
125 begin
126   delete from employees where employee_id = 100;
127 
128 exception
129   --3. 处理异常
130   when temp_exception then
131        dbms_output.put_line('违反完整性约束!');
132 end;
133 
134 --21. 自定义异常: 更新指定员工工资,增加100;若该员工不存在则抛出用户自定义异常: no_result
135 
136 declare
137   --自定义异常                                   
138   no_result exception;   
139 begin
140   update employees set salary = salary + 100 where employee_id = 1001;
141 
142   --使用隐式游标, 抛出自定义异常
143   if sql%notfound then
144      raise no_result;
145   end if;  
146 
147 exception
148 
149   --处理程序抛出的异常
150   when no_result then
151      dbms_output.put_line('更新失败');
152 end;

上一篇:基于oracle 的PL/SQL编程 -变量使用


下一篇:【MySQL】十一、分组函数(group by,having),多字段分组查询