• Oracle数据库---异常处理


    Oracle异常处理
    在PL/SQL语句书写时,需要处理的异常
    -- 不做异常处理时
    DECLARE
    v_name emp.ename%TYPE;
    v_sal emp.sal%TYPE;
    BEGIN
    SELECT ename,sal
    INTO v_name,v_sal
    FROM emp
    WHERE empno = &no;
    IF v_sal <3000 THEN
    DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);
    END IF;
    END;
    在不做异常处理的时候,在输入员工编号的值的时候,如果在数据库中没有,就会报错

    select * from emp;
    --7369(empno) <3000(sal)
    --7839 (empno) >3000

    --Oracle的异常处理
    DECLARE
    v_name emp.ename%TYPE;
    v_sal emp.sal%TYPE;
    BEGIN
    SELECT ename,sal
    INTO v_name,v_sal
    FROM emp
    WHERE empno = &no;
    IF v_sal <3000 THEN
    DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);
    END IF;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('员工号输入错误!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('其他错误!');
    END;

    --预定义异常处理
    DECLARE
    v_name emp.ename%TYPE;
    v_sal emp.sal%TYPE:=&salary;
    BEGIN
    SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
    DBMS_OUTPUT.put_line(v_name||'的工资是:'||v_sal);
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('没有该工资的员工');
    WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.put_line('多个员工具有该工资');
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line('其他异常');
    END;

    SELECT * FROM EMP;
    --800(sal), 一个员工
    --1250 多个员工
    --8000 0个员工

    --获取异常的错误代码和错误信息
    BEGIN
    DELETE FROM DEPT WHERE deptno = &deptno;
    EXCEPTION
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
    END;


    --非预定义异常的处理
    DECLARE
    --1:定义非预定义异常的标识符
    e_fk EXCEPTION;
    --2:将定义好的异常与Oracle错误建立关联
    -- -2292错误代码
    PRAGMA EXCEPTION_INIT(e_fk,-2292);
    BEGIN
    DELETE FROM DEPT WHERE deptno = &deptno;
    EXCEPTION
    --3:捕获并处理异常
    WHEN e_fk THEN
    DBMS_OUTPUT.PUT_LINE('此部门下有员工,不能删除此部门!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLCODE||'####'||SQLERRM);
    END;

    --自定义异常
    DECLARE
    v_empno emp.empno%TYPE:=&empno;
    --1:定义异常
    e_no_result EXCEPTION;
    BEGIN
    UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
    IF SQL%NOTFOUND THEN
    --2:指定触发异常的时机
    RAISE e_no_result;
    ELSE
    COMMIT;
    END IF;
    EXCEPTION
    --3:捕捉并处理异常
    WHEN e_no_result THEN
    DBMS_OUTPUT.put_line('数据更新失败!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('其他错误');
    END;

    --异常处理函数SQLCODE和SQLERRM的使用
    DECLARE
    v_empno emp.empno%TYPE:= &empno;
    v_ename emp.ename%TYPE:= '&ename';
    v_deptno emp.deptno%TYPE:= &deptno;
    BEGIN
    INSERT INTO emp(empno,ename,deptno)VALUES(v_empno,v_ename,v_deptno);
    IF SQL%FOUND THEN
    DBMS_OUTPUT.put_line('数据插入成功!');
    COMMIT;
    END IF;
    EXCEPTION
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line('错误号:'||SQLCODE);
    DBMS_OUTPUT.put_line('错误信息:'||SQLERRM);
    END;

  • 相关阅读:
    Linux and the Unix Philosophy (Linux/Unix设计思想)
    rails获取json内容
    单元测试调试之传参篇
    部署注意细节之正式测试链接地址不同
    ajax页面排序的序号问题
    【51Nod1239】欧拉函数之和-杜教筛+哈希表
    【51Nod1239】欧拉函数之和-杜教筛+哈希表
    【51Nod1244】莫比乌斯函数之和-杜教筛+哈希表
    【51Nod1244】莫比乌斯函数之和-杜教筛+哈希表
    【BZOJ3112】防守战线(ZJOI2013)-单纯形法+对偶理论
  • 原文地址:https://www.cnblogs.com/xiaomifeng1010/p/11144211.html
Copyright © 2020-2023  润新知