异常处理
--异常处理分为预定义异常处理,非预定义异常处理,和自定义异常处理。
<1>.预定义异常处理
常见的Oracle已预定好的异常有:
异常名称 ORACLE错误 说明
CURSOR_ALREADY_OPEN ORA-6511 试图打开一个已打开的光标
DUP_VAL_ON_INDEX ORA-0001 试图破坏一个唯一性限制
INVALID_CURSOR ORA-1001 试图使用一个无效的光标
INVALID_NUMBER ORA-1722 试图对非数字值进行数字操作
LOGIN_DENIED ORA-1017 无效的用户名或者口令
NO_DATA_FOUND ORA-1403 查询未找到数据
NOT_LOGGED_ON ORA-1012 还未连接就试图数据库操作
PROGRAM_ERROR ORA-6501 内部错误
ROWTYPE_MISMATCH ORA-6504 主变量和光标的类型不兼容
STORAGE_ERROR ORA-6500 内部错误
TIMEOUT_ON_RESOURCE ORA-0051 发生超时
TOO_MANY_ROWS ORA-1422 SELECT INTD命令返回的多行
TRANSACTION_BACKED_OUT ORA-006 由于死锁提交被退回
VALUE_ERROR ORA-6502 转换或者裁剪错误
ZERO_DIVIDE ORA-1476 试图被零除
--eg:
declare
va number;
begin
va:=6;
dbms_output.put_line(va/0);
exception
when zero_divide then --zero_divide 是oracle内已经定义好的异常 可直接用.
dbms_output.put_line('被零整除了!');
end;
<2>.非预定义的异常处理
alter table emp modify --修改表emp使其empno不能为空
(empno not null);
declare
e_nullin exception; --自定义一个异常变量
pragma exception_init(e_nullin ,-01400);--将异常变量与标准oracle联系起来
begin
insert into emp values(null,'huam','kasdk',null,null,3000,600,10);
exception
when e_nullin then --利用异常 变量对其进行异常处理
dbms_output.put_line('你插入的empno值不能为空!');
end;
***预定义异常处理与非预定义异常处理的主要不同点在于 预定义异常中oracle既定义了错误信息
又定义了错误名称,而预定义异常处理中oracle只定义了错误信息,而没有定义错误名称,在使用
中还须要我们自已定义错误名称后再与错误信息相连之后才能使用。
<3>.自定义的异常处理
drop table emp--删除以前使用后的emp
create table emp as select * from SCOTT.emp --拷emp表
alter table emp
add constraint emp_ck check(sal>500 and sal <10000); --修改emp表使其sal在500--10000之间
declare
e_myexecption exception;--定义一个异常 变量
pragma exception_init(e_myexecption,-8888);--与自已定义的错误信息连接起来(这里的错误信息是oracal内不存在的)
aa number:=&sal;--从键盘接收数据
begin
if aa>10000 or aa<500 then
raise e_myexecption;--自定义异常必须要显示的抛出异常
else
update emp set sal=aa where empno =7788;
end if;
exception --当输入的不在500-10000之间时会异常处理
when e_myexecption then
dbms_output.put_line('你输入的工资超出500-10000之间!');
end;
<4>异常函数
当oracle出现异常时我们可以通过sqlcode来取的oracle的错误号,
利用sqlerrm可以取的错误文本信息 这两个函数在任何异常中都可
以用,但一般都用在others句子,others子句是异常处理的最后一
个重要环节。
--如在上题中当用户输入的不是number类型时若无others句子则要出现异常.修改如下
declare
va emp.ename%type;
begin
select ename into va from emp where sal = &aa;
dbms_output.put_line('雇员名' || va);
exception
when no_data_found then
dbms_output.put_line('没有找到数据');
when others then
dbms_output.put_line('sqlcode:' || sqlcode || ' sqlerrm' || sqlerrm);
end;
分享到:
相关推荐
第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据...
- **15天精讲精练_Android核心技术**:快速掌握Android开发基础知识,包括UI布局、Activity生命周期、数据存储、网络通信等。 - **Android从入门到实战**:从零开始学习Android开发,最终完成一个完整的项目,巩固所...
1. **20天横扫Java基础**:适合Java初学者,通过20天的学习掌握Java基础语法。 2. **尚硅谷Java基础实战——Bank项目**:通过实际项目加深对Java基础知识的理解和应用。 3. **Oracle、SQL、PLSQL视频教程**:数据库...
通过这21天的学习计划,《在21天内自学SQL》不仅为初学者提供了全面的SQL入门指南,也为有经验的开发者提供了深化技能的机会。无论是为了个人兴趣还是职业发展,这本书都是一个宝贵的资源,旨在帮助读者在有限的时间...
- **预约时间:** 考生需要提前至少15天进行考试预约。 **报名条件:** - **个人证件要求:** 参加考试时需携带两种有效的个人证件,例如身份证和驾照、学生证或工作证等。 - **无其他限制:** 华为认证考试报名...
**Day2:查询入门——SELECT语句** - **SELECT语句**:用于从一个或多个表中检索数据。 - **基本语法**:`SELECT column1, column2 FROM table_name;` - **示例**:`SELECT name, age FROM users;` **Day3:表达式...