异常处理
异常:提高程序的健壮性
DECLARE
  
BEGIN
  --触发异常
EXCEPTION
 --处理异常
END;
如果不处理异常,会将异常传递到应用环境
create or replace procedure get_name as
       v_name emp.ename%TYPE;
begin
       select ename into v_name from emp;
       dbms_output.put_line('name: ' || v_name);
end;

(一)处理系统异常情况
create or replace procedure get_name as
       v_name emp.ename%TYPE;
begin
       select ename into v_name from emp;
       dbms_output.put_line('name: ' || v_name);
exception
       when TOO_MANY_ROWS then --还有很其它预定义的异常:NO_DATA_FOUND
         dbms_output.put_line('返回了太多的数据行');
       when others then
         null;      
end;

(二)处理非预定义异常(有代码,但没有标识)
create table t(id int check(id >10),name varchar(30));
create or replace procedure insert_data_to_t as
begin
  insert into t values(2,'chen'); -- -2290
end;

create or replace procedure insert_data_to_t as
   check_id_exception exception;
   PRAGMA EXCEPTION_INIT(check_id_exception,-2290);
begin
  insert into t values(2,'chen');
exception
  when check_id_exception then
    dbms_output.put_line('id 号必须大于10');
  when others then
    null;
end;

(三)自定义异常(预定义异常和非预定义异常都与oracle有关,并且发生错误时隐含的触发,而自定义则与oracle没有关系,它必须要显式的触发)
create or replace procedure update_data_t as
begin
   update t set name='chen' where id = 1000;--其实没有这个人,但是没有任何的提示
end; 

create or replace procedure update_data_t as
   no_student_exception exception;
begin
   update t set name='chen' where id = 1000;
   if SQL%NOTFOUND then
     raise no_student_exception;
   end if;
exception
  when no_student_exception then
     dbms_output.put_line('没有数据被更新');
  when others then
     null;
end;

 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号