Oracle——12异常

本文介绍了PL/SQL中的异常处理机制,包括预定义异常、自定义异常及使用others异常捕捉未处理的异常。通过示例代码展示了如何有效地利用这些机制避免程序因异常而崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


语句执行过程中,可能会因为异常造成损失,甚至是系统崩溃。为了避免这种情况的发生,必须对异常进行处理。PL/SQL提供了对异常进行处理的方法。该方法会使得在PL/SQL代码部分执行的过程中无论何时发生了异常错误,都会自动转向执行异常处理部分。

 

1、预定义异常

预定义异常是由系统产生的。比如在出现0为除数的时候,系统会产生一个预定义的ZERO_DIVIDE异常。示例如下:

 

		declare 
			num1 number := 2;
			num2 number := 0;
			num3 number;
		begin
			num3 := num1/num2; --当执行这句的时候,系统捕捉到异常会自动转到异常处理部分,最后输出“不能除0”。
			exception
			when zero_divide then
				dbms_output.put_line('不能除0');
			when too_many_rows then
				dbms_output.put_line('too many rows');
		end;
 

如果在当前块中没有处理异常的代码,并且begin/end块是嵌套的,程序将继续在外部块中寻找处理异常的代码块,直到找到一个。如果最终没有处理异常的代码块存在,程序将结束。当对异常进行了处理后,程序将继续执行异常代码块之后的代码。

 

2、自定义异常

用户如果需要自定义异常的话,可以先定义一个exception变量,然后使用raise语句来抛出一个异常,然后在捕捉异常的时候捕捉对应的抛出异常。示例代码如下:

 

		declare
			selfDefineException exception; /*定义异常变量*/
			num1 number := 2;
			num2 number := 3;
			num3 number;
		begin
			num3 := num1 + num2;
			if num3=5 then
				raise selfDefineException; /*抛出自定义的异常*/
			end if;
			exception
				when selfDefineException then /*捕获自定义的异常*/
					dbms_output.put_line("selfDefineException");
				when zero_divide then
					dbms_output.put_line("不能除0");
		end;
		
 

3、使用others异常

对于那些没有直接捕捉的异常,都可以使用others异常进行捕捉,others异常可以单独使用,但当与其他异常处理一起使用的时候必须放在所有情况的最末尾。示例代码如下:

 

		declare 
			num1 number := 2;
			num2 number := 0;
			num3 number;
		begin
			num3 := num1/num2; --当执行这句的时候,系统捕捉到异常会自动转到异常处理部分,最后输出“不能除0”。
			exception
			when others then /*这里直接捕捉others异常*/
				dbms_output.put_line('不能除0');
		end;
### Oracle 存储过程中的异常处理方法 在 Oracle 数据库中,存储过程的异常处理是一个重要的组成部分,它能够帮助开发者捕获运行时错误并采取相应的措施。以下是关于如何实现 Oracle 存储过程中异常处理的具体方法和最佳实践。 #### 1. 使用 `EXCEPTION` 块进行异常处理 Oracle 提供了一个专门用于异常处理的部分——`EXCEPTION` 块。该块允许开发者定义特定类型的异常以及对应的处理逻辑。如果发生未被捕获的异常,则会触发默认的行为或将控制权交给外部调用者。 ```sql CREATE OR REPLACE PROCEDURE example_procedure IS v_number NUMBER; BEGIN SELECT non_existent_column INTO v_number FROM dual; -- 可能引发 NO_DATA_FOUND 或 TOO_MANY_ROWS 错误 EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No data found exception occurred.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An unexpected error has occurred: ' || SQLERRM); END; / ``` 上述代码展示了如何通过 `WHEN ... THEN` 结构来捕捉已知异常(如 `NO_DATA_FOUND`),同时也提供了通用的 `OTHERS` 来应对未知情况[^1]。 #### 2. 自定义异常 除了内置的标准异常外,还可以声明自己的自定义异常以满足更具体的需求。这通常涉及先定义一个新的变量作为异常标志,然后利用 `RAISE` 关键字手动抛出这个异常。 ```sql CREATE OR REPLACE PROCEDURE custom_exception_example IS my_custom_exception EXCEPTION; PRAGMA EXCEPTION_INIT(my_custom_exception, -20001); -- 将其绑定到指定编号 BEGIN IF some_condition THEN RAISE my_custom_exception; END IF; EXCEPTION WHEN my_custom_exception THEN DBMS_OUTPUT.PUT_LINE('Custom Exception Raised'); END; / ``` 这里演示了怎样创建一个名为 `my_custom_exception` 的新异常,并将其初始化为 `-20001` 用户定义错误码的一部分[^4]。 #### 3. 利用 `RAISE_APPLICATION_ERROR` 对于希望向客户端传递更多信息的情况,可以考虑使用 `RAISE_APPLICATION_ERROR` 函数来自动生成带有描述性的消息字符串的应用层错误信号给上一层级。 ```sql CREATE OR REPLACE PROCEDURE raise_app_error_demo(car_name VARCHAR2) IS BEGIN IF car_name IS NULL THEN RAISE_APPLICATION_ERROR(-20003, 'Car name cannot be null.', TRUE); ELSE DBMS_OUTPUT.PUT_LINE('Processing purchase request for: ' || car_name); END IF; END; / ``` 此片段说明当输入参数为空时,将返回一条清晰指示问题所在的信息串[^5]。 #### 4. 最佳实践建议 为了使基于 Oracle 的项目更加健壮可靠,在设计阶段就应该充分考虑到可能出现的各种边界条件及其对应解决方案: - **始终包含全局异常处理器**:即使已经针对大部分常见情形做了单独安排,仍需保留兜底方案以防遗漏。 - **记录日志以便后续分析**:每当遇到严重程度较高的事件时都应该写入持久化介质保存下来方便以后追踪定位原因。 - **遵循一致命名约定**:无论是函数还是内部使用的标识符都应保持统一风格便于理解和协作交流。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值