plsql的异常提示怎么定位_PLSQL异常处理
1、定义
异常:PL/SQL在执行的过程中所产生的标识符,PL/SQL中的一个警告或错误都被称为异常。错误通常分为两类:
编译时错误--一般是语法错误,由PL/SQL引擎发现并报告给用户,程序本身不能处理,因为还没运行。
运行时错误--程序在运行时引发的错误,例如没返回结果与返回多个结果(只能返回一行结果的情况下)
异常处理---通常是指处理运行时错误。
引发异常的一个重要原因是处理数据时发生错误。统计表明,SELECT语句、DML语句以及游标操作语句更容易引发异常。
编写PL/SQL块的主要目的是处理数据,而PL/SQL块在逻辑上与数据是分开的,程序员根本无法预料数据的变化。
例如,要查询部门10的员工,程序员根本不知道这个部门中有没有员工, 有一个还是有多个员工。
所以在编写程序时,程序员应该考虑各种可能出现的异常,在程序中编写这些异常的处理代码,这样的程序才能经受各种错误的考验。
2、预定义异常
预定义异常:Oracle把一些常见的错误定义为有名字的异常,这就是预定义的异常。【有异常代码,异常名称,异常消息】
Oracle有许多预定义的异常,在进行处理时不需要再定义,只需要编写相应的异常处理程序即可。
当PL/SQL块执行发生错误时,数据库服务器将自动抛出相应的异常,并执行编写的异常处理程序。
预定义说明的
oracle 异常
ORACLE 错误 异常名
说明
ORA-0001 Dup_val_on_index
试图破坏一个唯一性限制
ORA-0051 Timeout-on-resource
在等待资源时发生超时
ORA-0061 Transaction-backed-out
由于发生死锁事务被撤消.
ORA-1001 Invalid-cursor
试图使用一个无效的游标
ORA-1012 Not-logged-on
没有连接到ORACLE
ORA-1017 Login-denied
无效的用户名/口令
ORA-1403 No_data_found
没有找到数据
ORA-1422 Too-many-rows select into
返回多行
ORA-1476 Zero-divide
试图被零除
ORA-1722 Invalid-number
转换一个数字失败
ORA-6500 Storage-error
内存不够引发的内部错误
ORA-6501 Program-error
内部错误
ORA-6502 Value-error
转换或截断错误
ORA-6511 Cursor-already-open 试图打开一个已存在的
游标
ORA-6530 Access-into-null 试图为null
对象的属性赋值
3、非预定义异常
非预定义异常:在PL/SQL中还有一类会经常遇到的错误,每个错误都有相应的错误代码和错误原因,但是由于Oracle没有为这样的错误定义一个名称,因而不能直接进行异常处理。
在一般情况下,只能在PL/SQL块执行出错时查看其出错信息。
对于这类非预定义的异常,由于它也被自动抛出的,因而只需要定义一个异常,
把这个异常的名称与错误的代码关联起来,然后就可以像处理预定义异常那样处理这样的异常了。
在抛出ORACLE预定义异常之前先抛出自己定义的非预定义异常,可以大大节约异常定位的时间,
比如说很多情况都最终导致同一种预定义异常情况下。
4、用户自定义异常
用户自定义异常:程序员可以把一些特定的状态定义为异常。这样的异常一般由程序员自己决定,在一定的条件下抛出,然后利用PL/SQL的异常机制进行处理。
对于用户自定义的异常,有两种处理方法。
第一种方法是先定义一个异常,并在适当的时候抛出,然后在PL/SQL块的异常处理部分进行处理。
用户自定义的异常一般在一定的条件下抛出,于是这个条件就成为引发这个异常的原因。
第二种方法是向调用者返回一个自定义的错误代码和一条错误信息。
自定义错误代码的范围是-20000到-20999,是oracle为自定义错误保留的
在处理用户自定义的异常时,也可以使用函数SQLCODE和SQLERRM,这两个函数分别用于返回指定的错误代码和错误信息。
5、系统预定义异常例子
DECLARE
v_ename
emp1.ename%TYPE;
v_sal emp1.sal%TYPE;
BEGIN
SELECT ename, sal
INTO v_ename, v_sal
FROM emp1;
WHERE empno=9100;
--不存在的员工编号,会返回NO_DATA_FOUND异常
DBMS_OUTPUT.PUT_LINE('ename is
'||v_ename||'.');
DBMS_OUTPUT.PUT_LINE('salary is
'||v_sal||'.');
EXCEPTION
WHEN NO_DATA_FOUND THEN --无返回数据
DBMS_OUTPUT.PUT_LINE('data not found.');
WHEN TOO_MANY_ROWS THEN
--返回了多行数据
DBMS_OUTPUT.PUT_LINE('exact fetch returns more than requested
number of rows.');
WHEN OTHERS THEN --其他异常
DBMS_OUTPUT.PUT_LINE('others
exception.');
END;
OTHERS异常处理器能截获所有未经处理的异常,所以,OTHERS是最后定义的异常处理器。
6、非预定义异常例子
DECLARE
emp_e
EXCEPTION;
PRAGMA EXCEPTION_INIT (emp_e, -2292);
--EXCEPTION_INIT将异常名和一个系统错误代码联系起来
v_deptno dept.deptno%TYPE :=
&p_deptno;
BEGIN
DELETE FROM dept
WHERE deptno =
v_deptno;
--COMMIT;
EXCEPTION
WHEN emp_e THEN
DBMS_OUTPUT.PUT_LINE ('Cannot remove dept ' ||
TO_CHAR(v_deptno) || '.
Employees exist. ');
END;
ORA-02292: integrity constraint
(string.string) violated - child record found
Cause: attempted to delete a
parent key value that had a foreign key dependency.
Action: delete
dependencies first then parent or disable constraint.8
7、使用错误函数(SQLCODE和SQLERRM)
例一、
DECLARE
d_excep EXCEPTION;
PRAGMA EXCEPTION_INIT (d_excep, -2292);
BEGIN
DELETE FROM dept WHERE deptno=30;
EXCEPTION
WHEN d_excep THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
例二、
先建立一个保存错误信息的表
CREATE
TABLE u_err_table(
username VARCHAR2(20),
errdate
DATE,
errcode NUMBER,
errm VARCHAR2(100)
);
执行以下语句块,可能引发的异常交给OTHERS处理
DECLARE
v_sqlcode NUMBER;
v_sqlerrm VARCHAR2(100);
v_deptno dept.deptno%TYPE :=
&deptno;
BEGIN
DELETE FROM dept
WHERE deptno =
v_deptno;
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlerrm := SQLERRM;
INSERT INTO u_err_table
VALUES (USER, SYSDATE,
v_sqlcode, v_sqlerrm);
END;
/
查看错误记录表:SELECT * FROM
u_err_table;
8、用户自定义异常例子
在上面错误函数的例子里,如果输入一个不存在的部门号,程序并不会产生异常,就要用到用户自定义的异常来实现。
DECLARE
e_err_deptno EXCEPTION;
--定义异常
v_deptno dept.deptno%TYPE :=
&deptno;
BEGIN
DELETE FROM dept
WHERE deptno = v_deptno;
IF SQL%NOTFOUND THEN
RAISE e_err_deptno;
--抛出异常
END
IF;
EXCEPTION
WHEN e_err_deptno THEN
--处理异常
DBMS_OUTPUT.PUT_LINE('invalid
deptno.');
END;
可以使用RAISE_APPLICATION_ERROR返回自定义的错误消息,看起来跟ORACLE的标准错误一样。
DECLARE
v_sqlcode NUMBER;
v_sqlerrm VARCHAR2(100);
v_deptno dept.deptno%TYPE
:= &deptno;
BEGIN
DELETE FROM dept
WHERE deptno =
v_deptno;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20001,'deptno not exists.');
END
IF;
EXCEPTION
WHEN OTHERS THEN
v_sqlcode := SQLCODE;
v_sqlerrm := SQLERRM;
DBMS_OUTPUT.PUT_LINE(v_sqlcode||':
'||v_sqlerrm);
END;
自定义异常的例子:
DECLARE
v_deptno
dept1.deptno%TYPE := &deptno;
dd_exc EXCEPTION;
BEGIN
DELETE
FROM dept1 WHERE deptno=v_deptno;
IF SQL%NOTFOUND THEN
RAISE
dd_exc;
ELSE
dbms_output.put_line(SQL%ROWCOUNT||' rows
deleted.');
END IF;
EXCEPTION
WHEN dd_exc THEN
dbms_output.put_line('no rows deleted.');
END;
/
plsql的异常提示怎么定位_PLSQL异常处理相关推荐
- plsql的异常提示怎么定位_oracle plsql 异常信息怎样查看
匿名用户 1级 2016-12-26 回答 PLSQL_Oracle Exception异常分类.异常抛出.异常处理.异常传播(概念) 一.摘要 在PLSQL程序开发过程中,很重要的部分就是对程序异常 ...
- plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致
plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致 . plsql 登录后提示: Database character se ...
- plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致 .
plsql 登录后提示: Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Ch ...
- iOS中Mach异常和signal信号介绍,以及当APP崩溃时做线程保活弹出程序异常提示框
我们经常会遇到APP闪退和崩溃的问题,那么我们应该通过什么变量去监听APP的异常呢?如何在程序崩溃时,保证程序不闪退,并给用户弹出一个提示框呢? 这是本文将要讲述的内容. 先介绍2个概念,Mach异常 ...
- Office 2003 出现异常提示遇到问题需要关闭“ 发送错误报告 ”“ 不发送 ”“以安全模式启动”
今天好友在QQ上提出Office 2003 出现异常提示:遇到问题需要关闭," 发送错误报告 "" 不发送 ""以安全模式启动" 之后只能开 ...
- java 7 异常新特性_Java7的异常处理新特性-addSuppressed()方法等
开发人员对异常处理的try-catch-finally语句块都比较熟悉.如果在try语句块中抛出了异常,在控制权转移到调用栈上一层代码之前,finally语句块中的语句也会执行.但是finally语句 ...
- 计算机开启时提示键盘错误,电脑开机出现异常提示keyboard not found的故障原因及解决方法_电脑故障...
电脑开机后屏幕显示keyboard not found. press f2 to continue .f1 to setup,具体问题现象如下所示: 故障原因分析: 出现这样的情况大多都是电脑在开机的 ...
- kail linux安装软件提示“无法定位软件包”解决方法
kail linux安装软件提示"无法定位软件包"解决方法 参考文章: (1)kail linux安装软件提示"无法定位软件包"解决方法 (2)https:// ...
- 重启nagios有异常提示Starting nagios:This account is currently not available
[root@ servers]# service nagios restart Running configuration check...done. Stopping nagios: done. S ...
最新文章
- 【BZOJ】1299: [LLH邀请赛]巧克力棒
- C#语言基础— 输入与输出
- 协议圣经(二) RTP组播音视频技巧
- 转载:一步一步和我学Apache JMeter
- LeetCode 20 Valid Parentheses (C++)
- LDA主题模型简介及Python实现
- 当前仍在编辑文章 - Java Excel处理 - 实操案例与方法手册
- 什么是云存储技术与云存储服务?
- Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
- java无法启动安装程序,Windows Fix中无法启动Java更新安装程序错误
- 2级c语言程序设计无忧考试,全国计算机二级c语言考试真题
- 软件实施工程师项目经验(转
- 2022年全球与中国对位芳纶和间位芳纶行业产销需求与投资预测分析报告
- 【小5聊】CSS基础之设置小箭头图标
- 视频教程-shader 基础之 2D技巧集合-Unity3D
- 概要设计和详细设计模板_网站模板不用设计 直接下载免费网站模板
- leetcode 1313. Decompress Run-Length Encoded List(python)
- 程序员数学--卡特兰数(Catalan number)
- 什么是亚稳态,如何消除?
- 如虎添翼:施加负压的电磁车模