欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle数据库之PLSQL异常

程序员文章站 2022-06-05 18:23:03
...
--============PLSQL==异常处理=============================
-- Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。
--PLSQL错误
----编译时错误
----运行时错误

--运行时错误
---- oracle错误 (ora-xxx)
---- PL/SQL运行错误
---- 用户定义的条件

--==========ORACLE错误处理机制===============
---- 在程序运行期间的错误对应一个异常Exception.
---- 当错误产生时抛出相应的异常.并被异常处理器捕获,
---- 程序控制权传递给异常处理器,由异常处理器来处理运行时错误.

---=========异常的触发类型==================
--隐士触发
----- oracle预定义异常
----- 非oracle预定义异常
--显式触发
----- 用户自定义异常

-- ========异常运行机制=====================
--异常捕获通过异常处理器实现,它是程序的一个独立部分.
--把错误与程序的其它部分分离开来,使程序逻辑更加易于理解.

--当异常产生时,控制权立即转移到异常处理器,一旦执行控制权被转移到异常处理器,

Oracle数据库之PLSQL异常

 
--就无法再回到本语句块的可执行部分,如果没有异常部分,则被传播到外层语句块.

Oracle数据库之PLSQL异常

 

--==异常处理语法:
exception
 when 异常名字1 then 处理异常语句1;
 when 异常名字2 or  异常名字3  then 处理异常语句2;
 when others then 其它处理3;
-- 允许有多个异常处理器
end;

--Exception关键字:标识异常处理的开始区域.
--一个异常处理器可以捕获多个异常,只需要在when子句中用or连接即可
--一个异常只能被一个异常处理器捕获,并进行处理.
-- others异常处理器总是作为异常处理最后一个异常处理器 ,
-- 负责处理那些没有被其他异常处理器捕获的异常.

--========Oracle预定义错误的捕获============
--no_data_found
--too_many_rows
--ZERO_DIVIDE

--演示 ORACLE预定义异常捕获的语法 ZERO_DIVIDE异常==========
declare
	v_id number(4) ;
begin
	select deptno into v_id from emp where 1= 2;--no_data_found Exception
	--select deptno into v_id from emp where 1= 1/0;--ZERO_DIVIDE Exception
	Exception
		when ZERO_DIVIDE 
			then dbms_output.put_line('ZERO_DIVIDE Exception');	
		when no_data_found
			then dbms_output.put_line('no_data_found Exception');
		when others 
			then	dbms_output.put_line(' Exception');
end;

-- 演示关联数组的异常
declare
	type ind_tab_array is 
		table of number index by binary_integer;
	ind_tab ind_tab_array; --自动初始化null
begin
	--ind_tab(null) :=3 VALUE_ERROR
	if(ind_tab(1)) =1 --NO_DATA_FOUND
		then dbms_output.put_line(ind_tab(1));
	end if;
	Exception
		when VALUE_ERROR
			then dbms_output.put_line('VALUE_ERROR');
		when NO_DATA_FOUND
			then dbms_output.put_line('NO_DATA_FOUND');
end;

--===============非预定义异常==============
--非预定义异常:某些异常在oracle中没有定义名词,只有一个ORA-xxxx,
SQL> insert into emp(empno ) values (null);
insert into emp(empno ) values (null)
                                *
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP"."EMPNO")

--我们把这样的异常定义一个名字(将异常名与异常编号相关联),称之为非预定义异常
--使用的基本过程
    --a.定义一个异常名 (declare)
    --b.将异常名与异常编号相关联(associate)
    --c.在异常处理部分捕捉并处理异常(reference)
declare
	e_key Exception;--定义
	pragma exception_init(e_key,-01400);--绑定关联
begin
	insert into emp(empno ) values (null);
	Exception
		when e_key
			then dbms_output.put_line('e_key');
		when others
			then dbms_output.put_line('unknow exception');
end;

--========用户自定义异常============
--自定义异常与Oracle错误没有任何关系,有开发人员为特定情况所定义的例外
--使用的基本过程
	--a.用户自定义异常必须在声明部分进行声明
	--b.当异常发生时,系统不能自动触发,需要使用Raise语句触发
	--c.在异常处理部分捕获并处理异常
	
--上述异常改成 用户自定义异常
declare
	e_key Exception ;
	empno number(4);
begin
	if empno is null 
	   then Raise e_key; --如果是null,触发异常
	end if;
	empno :=8080;
	insert into emp(empno) values (empno);
	
	Exception
		when e_key 
			then dbms_output.put_line('e_key');
	when others
		        then dbms_output.put_line('exception');
end;