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

相关文章
|
1月前
|
SQL 安全 网络安全
SQL安装程序规则错误解决方案
在安装SQL Server时,遇到安装程序规则错误是一个比较常见的问题
|
3月前
|
SQL 存储 关系型数据库
bat脚本拼写SQL并写文件
【8月更文挑战第7天】bat脚本拼写SQL并写文件
47 5
PLSQL-基本语法与记录类型
PLSQL-基本语法与记录类型
69 0
|
SQL Oracle 关系型数据库
Oracle数据库sqlplus命令行执行sql语句时,语句有中文报错解决
Oracle数据库sqlplus命令行执行sql语句时,语句有中文报错解决
103 0
|
SQL Oracle 关系型数据库
Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
557 0
Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
|
SQL Linux 数据库
Linux将hiveSQL字段当做命令执行解决办法
Linux将hiveSQL字段当做命令执行解决办法
|
SQL Oracle 关系型数据库
windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句
windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句
538 0
|
SQL Perl 关系型数据库
[20171220]toad plsql显示整形的bug.txt
toad 显示 整形 异常
1332 0