Oracle异常使用的详细说明
一、例外分类
Oracle将异常划分为三种类型:预定义异常、非预定义异常和自定义异常。
1)预定义的异常用于处理常见的Oracle错误。
2),非预定义异常用于处理预定义异常不能处理的异常。
3)自定义异常用于处理与Oracle错误无关的其他情况。
下面是一个小例子,说明如果不处理异常会发生什么情况。
编写一个存储过程,可以接收员工的编号并显示雇员的姓名。
SQL代码如下所示:
进行设置;
声明
v_ename EMP ENAME %型;
开始
选择从哪里v_ename易名为EMP empno =没有;
dbms_output.put_line('' | |名称:v_ename);
结束;
/
只需输入不存在的数字,返回将抛出以下异常:
ora-01403:没有找到数据
ora-06512:6行
异常捕获SQL代码如下所示:
进行设置;
声明
v_ename EMP ENAME %型;
开始
选择从哪里v_ename易名为EMP empno =没有;
dbms_output.put_line('' | |名称:v_ename);
例外
当no_data_found然后
dbms_output.put_line(数不到!);
结束;
/
随便输入不存在的号码,回到车上,会友好提示:号码还没有找到!
两。预定义的异常处理
预定义的异常是由PL / sql.an内部异常提供系统异常时触发的PL / SQL应用程序违反了Oracle的监管限制。PL / SQL提供了超过20个预定义的异常开发。让我们给你介绍常见的例外。
1),case_not_found预定义的异常
当case语句写在发展PL / SQL语句块,如果没有必要在当条件分支的case_not_found例外条款,将引发。
进行设置;
创建或替换程序sp_pro6(SPNO数)是
v_sal EMP。萨尔分型;
开始
选择从哪里v_sal萨尔为EMP empno = SPNO;
案例
当v_sal<1000
更新EMP组萨尔=萨尔+ 100 = SPNO empno;
当v_sal<2000
更新EMP组萨尔=萨尔+ 200 = SPNO empno;
案例;
例外
当case_not_found然后
dbms_output.put_line(the'case声明不符条件和v_sal| | | |);
结束;
/
-调用存储过程
SQL> exec sp_pro6(7369);
case语句没有匹配4444的条件。
2), cursor_already_open predefined exceptions
当打开重新打开游标的cursor_already_open例外是隐式地触发,
声明
emp_cursor是光标
选择ename,萨尔从EMP;
开始
打开emp_cursor;申报-当光标已经打开,所以无需再打开它
在emp_cursor环emp_record1
dbms_output.put_line(emp_record1。ename);
结束循环;
例外
当cursor_already_open然后
dbms_output.put_line('cursor已经打开的);
结束;
/
3),dup_val_on_index预定义的异常
当在对应于惟一索引的列中插入重复值时,隐含触发器异常将被暗示。
开始
插入部门价值(10,公共关系部,北京);
例外
当dup_val_on_index然后
dbms_output.put_line(不重复的值在deptno列);
结束;
/
4),invalid_cursorn预定义的异常
当试图对非法游标执行操作时,就会触发此异常。
例如,尝试从未打开的游标中提取数据,或关闭尚未打开的游标。此异常将触发此异常。
声明
emp_cursor是光标
选择ename,萨尔从EMP;
emp_record emp_cursor %ROWTYPE;
开始
开放emp_cursor;打开游标
取emp_cursor为emp_record;
dbms_output.put_line(emp_record。ename);
近emp_cursor;
例外
当invalid_cursor然后
dbms_output.put_line(请检查是否打开游标的);
结束;
/
5),invalid_number预定义的异常
此异常在输入数据不正确时触发。
例如,当数字100在厕所中写入时,它将触发异常。
进行设置;
开始
更新EMP组萨尔=萨尔+ 'AAA';
例外
当invalid_number然后
dbms_output.put_line('incorrectly输入号码);
结束;
/
6),no_data_found预定义的异常
下面是一个PL - C / SQL块,当选择进入的执行不返回行时触发异常。
进行设置;
声明
v_sal EMP。萨尔分型;
开始
选择从哪里进入v_sal EMP ENAME SAL = 'ljq;
例外
当no_data_found然后
dbms_output.put_line(不要有员工);
结束;
/
7),too_many_rows预定义的异常
执行SELECT语句时,如果返回多个行,则触发异常。
声明
v_ename EMP ENAME %型;
开始
选择不进v_ename从EMP;
例外
当too_many_rows然后
dbms_output.put_line(返回多行);
结束;
/
8),zero_divide预定义的异常
在执行2 0语句时触发异常。
9),value_error预定义的异常
当赋值操作执行,例外value_error将如果变量的长度不足以支持实际数据触发。
其他预定义的异常(这些异常不被触发,而是由Oracle触发,因此名称被称为其他预定义异常)。
1、login_denied
此异常是在用户非法登录时触发的。
2、not_logged_on
如果用户没有登录,执行DML操作,并将引发异常
3、storage_error
如果内存空间超出或内存被损坏,则触发此异常。
4、timeout_on_resource
如果Oracle正在等待资源,则超时会触发异常。
三。非预定义的异常
非预定义的异常来处理Oracle错误是预定义的异常无关。使用预定义的异常只能处理21 Oracle错误,当使用PL / SQL开发一个应用程序,其他一些Oracle错误可能会遇到的问题。例如,当DML语句是在PL / SQL语句块的执行,约束规则被违反,等等。在这种情况下,你也可以处理各种例外的甲骨文,因为非预定义的异常不多,我不在这里举一个例子。
四。处理自定义异常
预定义异常和自定义异常都与Oracle错误有关,Oracle错误可能意味着相应的异常。自定义异常与Oracle错误无关。它们是特定情况下开发人员定义的异常。
问题:请写下一个,接受雇员的编号,并在员工工资中加1000元。如果员工不存在,请提示。
创建或替换程序ex_test(SPNO数)是
开始
更新EMP组萨尔=萨尔+ 1000 = SPNO empno;
结束;
/
-调用存储过程,
执行ex_test(56);
这里,编号56是不存在的,报纸是不正常的,为什么现在不报例外呢
因为只是SELECT语句
你是怎样解决这个问题的修改代码如下:
-自定义异常
创建或替换程序ex_test(SPNO数)是
-对异常的定义
我的例外;
开始
-更新用户
更新EMP组萨尔=萨尔+ 1000 = SPNO empno;
SQL %发现这意味着没有更新
——并触发并提高;
如果SQL %未提出我的;
最后如果;
例外
当我再dbms_output.put_line(不更新任何用户);
结束;
/
现在再测试一遍:
SQL> exec ex_test(56);
不更新任何用户
希望本文能帮助您设计oracle数据库程序。