设为首页 收藏本站
查看: 1198|回复: 0

[经验分享] Oracle异常处理

[复制链接]

尚未签到

发表于 2018-9-25 08:03:45 | 显示全部楼层 |阅读模式
  异常在代码中的声明部分声明,在执行部分引发,在异常处理部分处理。一般异常分为两中:预定义异常和用户自定义异常。
  下面通过代码分别介绍异常的声明、执行、处理。
  1、用户自定义异常
  (a)异常声明
  


  • DECLARE
  •   -- Exception to indicate an error condition
  •   e_DuplicateAuthors EXCEPTION;
  

  同时在DECLARE部分声明其他三个变量,供下面函数使用
  


  • v_Author1 books.author1%TYPE;
  • v_Author2 books.author2%TYPE;
  • v_Author3 books.author3%TYPE;
  

  (b)异常引发,用户自定义异常是通过RAISE语句显示引发,而预定义异常则是在与它们关联的Oracle错误发生时候隐式引发的。异常引发代码如下:
  


  • BEGIN
  •   /* Find the IDs for the 3 authors of 'Oracle9i DBA 101' */
  •   SELECT author1, author2, author3
  •     INTO v_Author1, v_Author2, v_Author3
  •     FROM books
  •     WHERE title = 'Oracle9i DBA 101';

  •   /* Ensure that there are no duplicates */
  •   IF (v_Author1 = v_Author2) OR (v_Author1 = v_Author3) OR
  •      (v_Author2 = v_Author3) THEN
  •      RAISE e_DuplicateAuthors;
  •   END IF;
  

  (c)异常处理
  


  • EXCEPTION
  •   WHEN e_DuplicateAuthors THEN
  •     INSERT INTO log_table (info)
  •       VALUES ('Oracle9i DBA 101 has duplicate authors');
  • end;
  

  2、预定义异常
  预定义异常列表

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
SELECT INTO没有找到数据
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-6504
Rowtype-mismatch
宿主游标变量与 PL/SQL变量有不兼容行类型
ORA-6511  CURSOR-already-OPEN

试图打开一个已处于打开状态的游标
ORA-6530
Access-INTO-null
试图为null 对象的属性赋值
ORA-6531
Collection-is-null
试图将Exists 以外的集合( collection)方法应用于一个null pl/sql 表上或varray上
ORA-6532
Subscript-outside-limit
对嵌套或varray索引得引用超出声明范围以外
ORA-6533
Subscript-beyond-count
对嵌套或varray 索引得引用大于集合中元素的个数  (a)异常声明
  由于预定义异常是在与它们关联的Oralce错误发生的时候隐式引发的,所以不需要异常声明。
  (b)异常引发
  下面这段程序是向authors表中插入主键重复的记录。因此当第二条INSERT试图插入的时候,就会引发了这个错误:
  ORA-0001:unique constraint() violated
  该错误对应的异常就是DUP_VAL_ON_INDEX异常。
  


  • BEGIN
  •   INSERT INTO authors (id, first_name, last_name)
  •     VALUES (20000, 'John', 'Smith');
  •   INSERT INTO authors (id, first_name, last_name)
  •     VALUES (20000, 'Susan', 'Ryan');
  • END;
  

  (c)异常处理
  异常引发后,将不会执行下面这条语句,直接跳出异常。
  


  • INSERT INTO authors (id, first_name, last_name)
  • VALUES (20000, 'Susan', 'Ryan');
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600923-1-1.html 上篇帖子: ORACLE DATABASE 11G RMAN 备份与恢复 下篇帖子: oracle dataguard搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表