PLSQL例外处理

简介:

之前已经将游标浏览了一遍,为了提高PLSQL程序健壮性,先来写PLSQL的例外处理,即如果PLSQL代码块发生的报错,正常下不去捕捉处理,肯定会停止执行,捕捉到了例外并进行相应的处理,可以让程序继续执行,发生的未知错误称之为例外。

目标

1)使用预定义例外

2)使用非预定义例外

3)使用自定义例外

定义三种例外比较搞笑,预定义就是oracle常见的错误,非预定义就是处理预定义所不能处理的oracle错误,自定义就是处理跟oracle无关的错误。


捕捉并处理例外

EXCEPTION 

WHEN exception1 Then

statement1

、、、、

WHEN OTHERS THEN

statementend

记住 when others 永远在例外处理的最后一个条件那里,代表了以上你写的所有when都不满足的时候满足此others


【预定义错误】

由PLSQL提供的系统例外,违反了Oracle规则或系统限制时,就会触发一个内部例外,大概提供了二十多个,每一个预定义例外对应一个Oracle系统错误,如NO_DATA_FOUND对应的是ORA-01403错误

当没有数据获取的时候就会隐含的触发这个错误,TOO_MANY_ROWS等

【非预定义错误】

非预定义错误用于处理与预定义例外无关的Oracle错误,这里给了一个案例就是比如违反了约束。

使用的时候需要三步:

1)定义部分定义例外名称,declare e_integrity exception;

2)在例外和Oracle错误之间建立关联 pragma exception_init(e_integrity,-2291);

3)例外处理部分捕捉并处理例外

declare

e_integrity exception;

pragma exception_init(e_integrity,-2291);

begin

update emp set deptno=%dno where empno=&eno;

commit;

exception

when e_integrity then

dbms_output.put_line('not exists deptno');

when others then

dbms_output.put_line(sqlcode);

end;


【自定义例外】

自定义例外最大的区别就是需要显示的触发

使用的时候三步:

1)定义部分定义 e_no_employee exception;

2)执行部分触发 if SQL%NOTFOUD then raise e_no_employee;

3)例外处理部分捕捉并处理

declare

e_integrity exception;

pragma exception_init(e_integrity,-2291);

e_no_employee exception;

begin

update emp set deptno=&dno where empno=&eno;

if SQL%NOTFOUND then

raise e_no_employee;

end if;

exception

    when e_integrity then

    dbms_output.put_line('deptno not exists');

    when e_no_employee then

    dbms_output.put_line('empno not exists');

end;


另外一种就是例外函数,这个在c编写的时候经常用到就是SQLCODE和SQLERRM,用于取得错误号和错误信息,

dbms_output.put_line(sqlcode);

dbms_output.put_line(sqlerrm);

在一个另外就是编译的时候经常用到的警告分为三类:

1)server:如参数的别名问题,

2)performance :性能问题,如类型变换时的性能问题

3)all:该关键字用于检查所有警告

控制警告消息

alter system set plsql warnings='enable:all';

alter session set plsql_warnings='enable:performance';

alter procedure hello complie ;这句话好像是重新编译hello过程


这个问题关键是理解这三类警告信息,比如死代码需要用哪个类检查,不执行但是有应该是代码块执行的性能问题,所以检查的时候制成performance,


另外一点是属性与异常,比如SQL%NOTFOUND与NO_DATA_FOUND的区别于谁产生的,可以用在什么时候前外别混淆了



本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1953983

相关文章
|
Swift
Swift 设置阴影
阴影的设置是通过layer的shadow设置的,其中offset为阴影的偏移量,探索下offset是如何影响阴影显示的
877 0
Swift 设置阴影
|
机器学习/深度学习 数据采集 人工智能
人工智能与机器学习的前景和挑战
人工智能和机器学习的前景是令人振奋的,它们在许多领域带来了创新和变革。然而,随着前景的广阔,也伴随着一些挑战,如数据质量、隐私和伦理问题。通过持续的研究和努力,我们有望克服这些挑战,实现人工智能和机器学习的更大潜力。从自动驾驶汽车到医疗诊断,从自然语言处理到工业自动化,人工智能和机器学习将继续塑造我们的世界。
1013 1
人工智能与机器学习的前景和挑战
|
9月前
|
存储 供应链 数据库
Hologres 索引:概念与实用场景
本文介绍了 Hologres 索引的概念、类型及在实际场景中的应用。Hologres 是阿里云的一款强大数据库产品,其索引功能显著提升了数据查询性能。文章详细探讨了 B 树索引、哈希索引和位图索引的特点及应用场景,并介绍了索引的创建和维护方法。此外,还列举了 Hologres 中的重要参数设置及其使用限制,最后通过电商、金融、物流和社交媒体等领域的具体案例,展示了索引在不同场景下的实用价值。
304 10
|
9月前
|
Kubernetes Java 调度
记一次应用优雅下线排查经历
本文记录了一次线上应用发版时出现500错误的排查过程。问题出现在滚动更新过程中,部分请求调度到了正在下线的Pod,导致500错误。通过增加PreStop Hook、调整TerminationGracePeriodSeconds以及配置Java应用的优雅下线,最终解决了问题。此外,还发现SLB的长连接问题,并通过配置SLB优雅下线彻底解决了请求失败的情况。
|
11月前
|
机器学习/深度学习 存储 人工智能
揭秘机器学习背后的神秘力量:如何高效收集数据,让AI更懂你?
【10月更文挑战第12天】在数据驱动的时代,机器学习广泛应用,从智能推荐到自动驾驶。本文以电商平台个性化推荐系统为例,探讨数据收集方法,包括明确数据需求、选择数据来源、编写代码自动化收集、数据清洗与预处理及特征工程,最终完成数据的训练集和测试集划分,为模型训练奠定基础。
284 3
|
11月前
|
机器学习/深度学习 监控 搜索推荐
电商平台如何精准抓住你的心?揭秘大数据背后的神秘推荐系统!
【10月更文挑战第12天】在信息爆炸时代,数据驱动决策成为企业优化决策的关键方法。本文以某大型电商平台的商品推荐系统为例,介绍其通过收集用户行为数据,经过预处理、特征工程、模型选择与训练、评估优化及部署监控等步骤,实现个性化商品推荐,提升用户体验和销售额的过程。
488 1
|
11月前
|
机器学习/深度学习 人工智能 算法
人工智能-大语言模型-微调技术-LoRA及背后原理简介
人工智能-大语言模型-微调技术-LoRA及背后原理简介
560 0
|
机器学习/深度学习 编解码 人工智能
视频分辨率的历史发展,未来趋势是什么?
随着技术的不断发展,视频分辨率也在不断提高。视频分辨率是指视频图像中可显示的像素数量,通常表示为水平像素数和垂直像素数。它对于观看视频时的清晰程度和细节呈现有着重要的影响。 本文将会介绍视频分辨率的基本概念,包括单位、历史发展、标准和未来趋势。我们还会探讨视频分辨率对观影体验的影响以及如何选择适合自己设备的视频分辨率。 无论您是电影爱好者还是普通用户,通过本文,您将能够了解到视频分辨率在过去的发展历程和未来的趋势,从而更好地使用和享受视频娱乐。
视频分辨率的历史发展,未来趋势是什么?
|
网络协议 API 数据安全/隐私保护
|
JSON 监控 前端开发
基于Springboot外卖系统11:菜品新增类别+类别信息分页查询
后台系统中可以管理分类信息,分类包括两种类型,分别是 菜品分类 和 套餐分类 。当我们在后台系统中添加菜品时需要选择一个菜品分类,在后台系统中添加一个套餐时需要选择一个套餐分类,在移动端也会按照菜品分类和套餐分类来展示对应的菜品和套餐。
352 0