• ORACLE异常处理及函数


     

     

     

    有三种类型的异常错误 :
    预定义 ( Predefined )错误
    ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。


    非预定义 ( Predefined )错误
    即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。


    用户定义(User_define) 错误
    程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

    异常处理结构:
    异常处理部分一般放在 PL/SQL 程序体的后半部
    EXCEPTION
    WHEN first_exception THEN <code to handle first exception >
    WHEN second_exception THEN <code to handle second exception >
    WHEN OTHERS THEN <code to handle others exception >
    END;
    异常处理可以按任意次序排列,但 OTHERS 必须放在最后


    预定义的异常处理

     


    对于预定义异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
    例: DECLARE
    v_empno emp.empno%TYPE :=&empno;
    v_sal emp.sal%TYPE;
    BEGIN
    SELECT sal INTO v_sal FROM emp WHERE empno=v_empno;
    IF v_sal<=1500 THEN
    UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
    DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已更新!');
    ELSE
    DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已经超过规定值!');
    END IF;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_empno||'的员工');
    WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);
    END;


    非预定义的异常处理
    对于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义
    步骤如下:
    在PL/SQL 块的声明部分定义异常情况:
    <异常情况> EXCEPTION;
    将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句
    PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);
    在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
    deptno_remaining EXCEPTION;
    PRAGMA EXCEPTION_INIT(deptno_remaining, -2292);
    /* -2292 是违反一致性约束的错误代码 */


    用户自定义的异常处理
    用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
    对于这类异常情况的处理,步骤如下 :
    在PL/SQL 块的声明部分定义异常情况 :
    <异常情况> EXCEPTION;
    RAISE <异常情况>
    在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理


    DECLARE
    v_empno emp.empno%TYPE :=&empno;
    no_result EXCEPTION;
    BEGIN
    UPDATE emp SET sal=sal+100 WHERE empno=v_empno;
    IF SQL%NOTFOUND THEN
    RAISE no_result;
    END IF;
    EXCEPTION
    WHEN no_result THEN
    DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);
    END;

    RAISE_APPLICATION_ERROR函数
    例:declare
    v_deptid departments.department_id%type := &no;
    v_dname departments.department_name%type;
    begin
    select department_name into v_dname from departments
    where department_id = v_deptid;
    dbms_output.put_line(v_dname);
    exception
    when others then
    raise_application_error(-20001 , 'department '||v_deptid||' does not exists');
    end;

     

  • 相关阅读:
    Codeforces Round #613 (Div. 2)
    Codeforces Round #575 (Div. 3)
    Codeforces Round #572 (Div. 2)
    CodeCraft-20 (Div. 2)
    Educational Codeforces Round 76 (Rated for Div. 2)
    欧拉筛法模板代码
    【Android Studio】安卓开发初体验3.1——UI设计之常用控件
    【kotlin】adapterPosition方法返回-1 无法获取位置
    【洛谷】P1009 阶乘之和——高精度算法
    【Android Studio】安卓开发初体验2——Activity
  • 原文地址:https://www.cnblogs.com/-maji/p/7235793.html
Copyright © 2020-2023  润新知