oracle中的三种异常情况

pl/sql中关于异常的处理:

    程序在正常运行过程中发生的未预料的事件;
	为了提高代码的健壮性,使用异常处理部分可以有效的解决程序正常执行过程中可能出现的错误,使程序正常运行;
	
	pl/sql中异常的定义格式:
	    declare
	    begin
	    exception
        end;
        
    异常分为三类:
        预定义异常、非预定义异常、自定义异常
        
    预定义异常:由系统自定义的异常;例,no_data_found
        
        常用系统预定义异常:
            预定义异常处理(2*个)
		错误号		异常错误信息名称		说明
		ORA-00001	DUP_VAL_ON_INDEX	试图破坏一个唯一性限制
		ORA-00051	TIMEOUT_ON_RESOURCE	在等待资源时发生超时
		ORA-01001	INVALID_CURSOR		试图使用一个无效的游标
		ORA-01012	NOT_LOGGED_ON		没有连接到oracle
		ORA-01017	LOGIN_DENIED		无效的用户名及口令
		ORA-01403	NO_DATA_FOUND		select into语句没有找到数据
		ORA-01422	TOO_MANY_ROWS		select into 返回多行
		ORA-01410	SYS_INVALID_ROWID	从字符中向rowid转换发生错误
		
		ORA-01476	ZERO_DIVIDE		将某个数字除以0的时候,会发生该异常
		ORA-01722	INVALID_NUMBER		给数字值赋非数字值的时候,该异常就会发生,这个异常也会发生在批读取时候LIMIT子句返回非正数的时候
		ORA-06500	STORAGE_ERROR		当内存不够分配SGA的足够配额或者是被破坏的时候,引发该异常
		ORA-06501	PROGRAM_ERROR		当Oracle还未正式捕获的错误发生时常会发生,这是因为数据库大量的Object功能而发生
		ORA-06502	VALUE_ERROR		将一个变量赋给另一个不能容纳该变量的变量时引发
		ORA-06504	ROWTYPE_MISMATCH	如果游标结构不适合PL/SQL游标变量或者是实际的游标参数不同于游标形参的时候发生该异常
		ORA-06511	CURSOR_ALREADY_OPEN	游标已经被OPEN,如果再次尝试打开该游标的时候,会出现该异常
		ORA-06530	ACCESS_INTO_NULL	试图访问未初始化对象的时候出现		

		ORA-06531	COLLECTION_IS_NULL	当程序去访问一个没有进行初始化的NESTED TABLE或者是VARRAY的时候,会出现该异常
		ORA-06532	SUBSCRIPT_OUTSIDE_LIMIT	使用非法的索引值来访问NESTED TABLE或者VARRAY的时候引发
		ORA-06533	SUBSCRIPT_BEYOND_COUNT	当分配给NESTED TABLE或者VARRAY的空间小于使用的下标的时候,发生该异常(类似于java的ArrayIndexOutOfBoundsException)
		ORA-06592	CASE_NOT_FOUND		如果定义了一个没有ELSE子句的CASE语句,而且没有CASE语句满足运行时条件时出现该异常
		ORA-30625	SELF_IS_NULL		调用一个对象类型非静态成员方法(其中没有初始化对象类型实例)的时候发生该异常
		ORA-01725	USERENV_COMMITSCN_ERROR	只可使用函数USERENV('COMMITSCN')作为INSERT语句的VALUES子句中的顶级表达式或者作为UPDATE语句的SET子句中的右操作数


        预定义异常的处理方式:
            begin
            exception
                when ZERO_DIVIDE then
                    dbms_output.put_line('除数不能为零');
            end;
            
	非预定义异常:处理与预定义异常无关的,其它异常;
        步骤:
            定义异常:<异常情况>exception
		    将定义好的异常情况与标准的oracle错误联系起来:pragma exception_init(<异常情况>,<错误代码>)
		    在pl/sql块的异常情况处理部分对异常情况做出相应的处理
		    
        例如:
            例:删除部门信息表中的部门号;
		
    		1.获得异常代号和异常内容:
    		begin
    		exception 
    		  when others then
    		    dbms_output.put_line(sqlcode||' '||sqlerrm);
    		end;
    		
    		2.定义异常并将异常与标准的oracle错误联系起来:
    		declare 
    		  e_fk exception;
    		  pragma exception_init(e_fk,-2292);
    
    		3.在pl/sql块处理异常:
    		exception
    		  when e_fk then
    		    执行语句
    		    
	自定异常:用户自定义的;
	    在某个特定事件发生时向应用程序的用户发出一些警告信息,而事件本身不会抛出oracle内部异常;
		用户自定义的异常错误是通过显式使用raise语句触发。当错误引发时,控制就会转向exception块异常错误部分执行错误处理的代码;
		
        例:输入员工号,涨100元工资,对于错误的员工号进行自定义异常的定义
		declare e_no exception;
		begin
		  update语句;
		  if sql%notfound then
		    raise e_no;
		  else
		    commit;
		exception
		  when e_no then
		    执行语句;
		end;
复制代码


转载于:https://juejin.im/post/5d0b3fc46fb9a07edf274a65

猜你喜欢

转载自blog.csdn.net/weixin_33918114/article/details/93180565