oracle中异常处理(被0除),Oracle学习教程之错误处理

错误处理

在运行程序时出现的错误叫做异常,发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分。

异常有两种类型:

1,预定义异常 -  当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发

2,用户定义异常  -  用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

处理预定义异常示例:

DECLARE

emprnum emp.empno%type;

BEGIN

SELECT empno INTO empnum FROM emp;

EXCEPTION

WHEN TOO_MANY_ROWS THEN

DBMS_OUTPUT.PUT_LINE ('返回多行');

END;

预定义的异常

预定义异常名

描述

ACCESS_INTO_NULL

试图给一个没有初始化的对象赋值

CURSOR_ALREADY_OPEN

试图打开一个已经打开的游标

DUP_VAL_ON_INDEX

试图在一个有惟一性约束的字段中存储重复的值

NVALID_CURSOR

试图执行一个无效的游标

LOGIN_DENIED

用一个无效的用户名或口令登录

NO_DATA_FOUND

查询语句没有返回数据

NOT_LOGGED_ON

连接数据库失败

SUBSCRIPT_OUTSIDE_LIMIT

表或数组类型变量中索引值超出系统范围

SUBSCRIPT_BEYOND_COUNT

表或数组类型变量中索引值超出系统范围

TOO_MANY_ROWS

查询语句返回多行数据

VALUE_ERROR

变量转换时形成无效值

ZERO_DIVIDE

被零除

处理用户定义异常

自定义异常处理先定义,后触发,再处理。

1.定义异常处理

   EXCEPTION;

异常处理名是用户定义的,EXCEPTION 是异常处理关键字。

2.触发异常处理

在 PL/SQL 程序块的执行部分可能出现异常处,写触发语句捕获异常,触发异常处理的语句格式如下:

RAISE ;

3.处理异常

一个 PL/SQL 程序块中可以包含多个异常处理,根据不同的异常处理名来执行不同的异常处理程序。在 PL/SQL 程序块的 EXCEPTION 中编写异常处理程序,定义异常处理程序的方法如下:

EXCEPTION WHEN        THEN

;

……

WHEN        THEN

;

示例:

DECLARE

invalidDEPT EXCEPTION;

v_dept VARCHAR2(10);

BEGIN

v_dept := '&dept';

IF v_dept NOT IN ('10','20','30','40')THEN

RAISE invalidDEPT;

ELSE

DBMS_OUTPUT.PUT_LINE('您输入的部门是'|| v_dept);

END IF;

EXCEPTION

WHEN invalidDEPT THEN

DBMS_OUTPUT.PUT_LINE('没有该部门');

END;

引发应用程序异常

RAISE_Application_ERROR 过程

1,用于创建用户定义的错误信息

2,可以在可执行部分和异常处理部分使用

3,错误编号必须介于 –20000 和 –20999 之间

4,错误消息的长度可长达 2048 个字节

引发应用程序错误的语法:

RAISE_Application_ERROR(error_number, error_message);

引发应用程序异常

RAISE_Application_ERROR创建用户定义的错误消息,用户定义的错误消息可以更详细地描述异常。引发应用程序错误地语法如下:

RAISE_Application_ERROR(error_number,error_message);

error_number:表示用户为异常指定的编号,该编号介于-20000和-20999之间的负整数。

Error_message:表示用户为异常指定的消息文本。长度可达到2048个字节。错误消息是与error_number关联的文本。

RAISE_Application_ERROR可以在可执行部分和异常处理部分使用。在调用该过程时,同时显示错误编号和信息。

例:当薪水为空时引发异常,将显示“工资异常”。

SQL >SET SERVEROUTPUT ON

SQL > DECLARE

sal_v emp.sal%type;

sal_exception exception;

BEGIN

SELECT NVL(sal,0) INTO sal_v FROM emp WHERE empno=&empno;

If sal_v=0 THEN

Raise sal_exception;

ELSE

DBMS_OUTPUT.PUT_LINE('此员工薪水为:'||sal_v);

END IF;

EXCEPTION

WHEN sal_exception THEN

RAISE_Application_ERROR(-20001,'工资异常');

END;

小结:

PL/SQL 是一种可移植的高性能事务处理语言

PL/SQL引擎驻留在 Oracle 服务器中

PL/SQL 块由声明部分、可执行部分和异常处理部分组成

PL/SQL 数据类型包括标量数据类型、LOB 数据类型和属性类型

控制结构包括条件控制、循环控制和顺序控制

PL/SQL 支持动态 SQL

游标用于处理查询结果集中的数据

游标类型有:隐式游标、显式游标和 REF 游标

隐式游标由 PL/SQL 自动定义、打开和关闭

显式游标用于处理返回多行的查询

显式游标可以删除和更新活动集中的行

要处理结果集中所有记录时,可使用循环游标

REF 游标运行的时候动态决定执行何种查询

运行时出现的错误叫做异常

异常可以分为预定义异常和用户定义的异常p

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值