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

[经验分享] Oracle自定义异常收集(一)

[复制链接]

尚未签到

发表于 2016-7-26 11:52:28 | 显示全部楼层 |阅读模式
  Oracle PL/SQL异常处理类型: Oracle中异常分为预定义例外,非预定义例外和自定义例外三种。处理预定义异常预定义异常是指由PL/SQL所提供的系统异常.当PL/SQL应用程序违反了Oralce规则或系统限制时,则会隐含的触发一个内部异常。当PL/SQL应用程序违反了Oralce规则或系统限制时,则会隐含的触发一个内部异常。 PL/SQL为开发人员提供了二十多个预定义异常:
  1、ACCESS_INTO_NULL 该异常对应于ORA-06530错误.当开发对象类型应用时,如果没有初始化对象,直接为对象属性赋值,该异常触发。
     DECLARE emp emp_type; BEGIN emp.name:='SCOTT';
     EXCEPTION
     WHEN ACCESS_INTO_NULL THEN
     DBMS_OUTPUT.PUT_LINE('首先初始化对象emp');
     END;
  
2、CASE_NOT_FOUND 对应于ORA-06592错误.在CASE语句时,如果WHEN子句没有包含必须的条件分支,并且没有仓含ELSE子句,被触发。
    DECLARE v_sal emp.sal%TYPE;
    BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=&&no;
    CASE
    WHEN v_sal?1000 THEN
        UPDATE emp SET sal=sal+100 WHERE empno=&no;
    WHEN v_sal?2000 THEN UPDATE emp SET sal=sal+150
    WHERE empno=&no; WHEN v_sal?3000 THEN
        UPDATE emp SET sal=sal+200
    WHERE empno=&no;
    END CASE;
    EXCEPTION WHEN CASE_NOT_FOUND THEN
         DBMS_OUTPUT.PUT_LINE('在CASE语句中没有与'||v_sal||'相关的条件.');
    END;
  
  3、COLLECTION_IS_NULL 对应于ORA-06531错误.在给集合元素(嵌套表或VARRAY类型)赋值前,必须首先寝化集合元素.否则触发该异常。
  DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE;
    ename_table ename_table_type;
    BEGIN
         SELECT ename INTO ename_table(2) FROM emp WHERE empno=&no;
         DBMS_OUTPUT.PUT_LINE('雇员名: '||ename_table(2));
   EXCEPTION WHEN COLLECTION_IS_NULL THEN
   DBMS_OUTPUT.PUT_LINE('必须初始化集合元素.');
   END;
  4、CURSOR_ALREADY_OPEN 对应于ORA-06511错误.当重新打开已经打开的游标时,会隐含地触发该异常。
  DECLARE CURSOR emp_cursor IS SELECT ename,sal FROM emp;
    BEGIN OPEN emp_cursor;
    FOR emp_record IN emp_cursor
    LOOP
       DBMS_OUTPUT.PUT_LINE(emp_record.ename);
    END LOOP;
    EXCEPTION WHEN CURSOR_ALREADY_OPEN THEN
    DBMS_OUTPUT.PUT_LINE('游标已经打开.');
    END;
  5、DUP_VAL_ON_INDEX 对应于ORA-00001错误,当在惟一索引所对应的列上键入重复值时触发。
  BEGIN
       UPDATE dept SET deptno=&new_no WHERE deptno=&old_no;
       EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
          DBMS_OUTPUT.PUT_LINE('在deptno列上不能出现重复值.'); 
       END;
  6、.INVALID_CURSOR 对应于ORA-01001错误.当试图在不合法的游标上执行操作时触发.如从未打开的游标取数据,关闭未打开的游标等。
    DECLARE CURSOR emp_cursor IS SELECT ename,sal FROM emp;
    emp_record emp_cursor%ROWTYPE;
    BEGIN 
    FETCH emp_cursor INTO emp_record;
    CLOSE emp_cursor;
    EXCEPTION WHEN INVALID_CURSOR THEN
        DBMS_OUTPUT.PUT_LINE('请检查游标是否已经打开.');
    END;
  7、INVALID_NUMBER 对应于ORA-01722错误.当内嵌SQL语句不能有效地将字符转变成数字时触发.如数值100被写成"1oo"。
    BEGIN UPDATE emp SET sal=sal+'100';
    EXCEPTION WHEN INVALID_NUMBER THEN
         DBMS_OUTPUT.PUT_LINE('输入的数字不正确.'); 
    END;
  8、NO_DATA_FOUND 对应于ORA-01403错误.当执行SELECT INOT未返回行,或引用了索引表未初始化元素时触发。
    DECLARE v_sal emp.sal%TYPE;
    BEGIN SELECT sal INTO v_sal FROM emp WHERE lower(ename)=lower('&name');
    EXCEPTION WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('不存在该雇员.');
    END;
  9、TOO_MANY_ROWS 对应于ORA-01422错误,当执行SELECT INTO语句时,如果返回超过一行触发该异常。
    DECLARE v_ename emp.ename%TYPE;
    BEGIN SELECT ename INTO v_ename FROM emp WHERE sal=&sal;
    EXCEPTION WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('返回多行.');
    END;
  10、ZERO_DIVIDE 对应于ORA-01476错误.当运行PL/SQL块时,如果使用数据值除0触发该异常。
    DECLARE
       num1 INT:=100;
       num2 INT:=0;
       num3 NUMBER(6,2);
    BEGIN 
       num2:=num1/num2;
    EXCEPTION WHEN ZERO_DIVIDE THEN
       DBMS_OUTPUT.PUT_LINE('分母不能为0.');
    END;
  11、SUBSCRIPT_BEYOND_COUNT 对应于ORA-06533错误.当使用嵌套表或VARRAY元素时,如果下标越界触发该异常.
   DECLARE TYPE emp_array_type IS VARRAY(20) OF VARCHAR2(10);
    emp_array emp_array_type;
    BEGIN
       emp_array:=emp_array_type('SCOTT','MARY');
       DBMS_OUTPUT.PUT_LINE(emp_array(3));
     EXCEPTION WHEN SUBSCRIPT_BEYOND_COUNT THEN
          DBMS_OUTPUT.PUT_LINE('下标越界.');
     END;
  12、SUBSCRIPT_OUTSIDE_LIMIT 对应于ORA-06532错误.当使用嵌套表或VARRAY元素时,如果下标为负值触发该异常.
    DECLARE TYPE emp_array_type IS varray(20) OF VARCHAR2(10);
      emp_array emp_array_type;
    BEGIN
       emp_array:=emp_array_type('SCOTT','MARY');
       DBMS_OUTPUT.PUT_LINE(emp_array(-1));
    EXCEPTION WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
       DBMS_OUTPUT.PUT_LINE('下标不能是负数.');
    END;
  13、VALUE_ERROR 对应于ORA-06502错误.当在PL/SQL块中执行赋值操作时,如果变量长度不足则触发该异常.
    DECLARE v_ename VARCHAR2(5);
    BEGIN
        SELECT ename INTO v_ename FROM emp WHERE empno=&no; 
        DBMS_OUTPUT.PUT_LINE(v_ename);
    EXCEPTION WHEN VALUE_ERROR THEN
        DBMS_OUTPUT.PUT_LINE('变量长度不够.');
    END;
  
  其它预定义异常:
  1.LONIN_DENIED 对应于ORA-01017错误.当PL/SQL应用程序要连接Oracle数据库时,如果密码错误则触发该异常.
  2.NOT_LOGGED_ON 对应于ORA-01012错误.如果程序没连接Oracle数据库,那么执行PL/SQL访问数据库时触发该异常.
  3.PROGRAM_ERROR 对应于ORA-06501.如果出现该错误,则表示PL/SQL内部问题,用户可能需要重新安装数据字典和PL/SQL系统包.
  4.ROWTYPE MISMATCH 对应于ORA-06504错误.赋值时,宿主游标变量和PL/SQL游标变量的返回类型不兼容时触发该异常.
  5.SELF_IF_NULL 对应于ORA-30625.当使用对象类型时,如果在NULL实例上调用成员方法则触发该异常.
  6.STORAGE_ERROR 对应于ORA-06500错误.PL/SQL块运行时,如果走出内在空间或内在被损坏则触发该异常.
  7.SYS_INVALID_ROWID 对应于ORA-01410错误.当将字符串转变为ROWID时,如果使用了无效的字符串则触发该异常.
  8.TIMEOUT_ON_RESOURCE 对应于ORA-00051错误.Oracle在等待资源超出现超时错误时触发该异常.
  

运维网声明 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.yunweiku.com/thread-249662-1-1.html 上篇帖子: 原创 oracle 数据完整性总结<十> 下篇帖子: Oracle 常用SQL技巧收藏(转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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