zoukankan      html  css  js  c++  java
  • oracle学习笔记(十六) PL/SQL 异常和goto语句

    PL/SQL 异常和goto语句

    异常

    预定义异常

    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 转换一个数字失败
    OTHERS(总是写在最后) 其它的异常(总是放在异常处理块的最后)

    Oracle内置有两个与异常有关的函数

    • SQLCODE 返回Oracle的错误代码
    • SQLERRM 返回Oracle的错误消息
    --使用预定义异常
    declare
      v_empno employee.empno%type;
      rec_emp employee%rowtype;
    begin
      v_empno := &请输入员工编号;
      select * into rec_emp from employee;-- where empno=v_empno;
      dbms_output.put_line('编号:'||rec_emp.empno||', 姓名:'||rec_emp.ename);
      
      --异常处理
      exception
        when NO_DATA_FOUND then --数据未找到
    		dbms_output.put_line('数据未找到,原因:'||SQLCODE||','||SQLERRM);
        when TOO_MANY_ROWS THEN
    		dbms_output.put_line('数据过多,不能给变量赋值,原因:'||SQLCODE||','||SQLERRM);
        when others then
          dbms_output.put_line('未知异常,原因:'||SQLCODE||','||SQLERRM);
    end;
    /
    

    自定义异常

    1. 声明异常: 变量名 exception;
    2. 抛出异常: raise 变量名;
    3. 处理异常:exception
    --问题:如果某员工没有奖金时抛出“无奖金异常”
    declare
      v_empno employee.empno%type := &请输入编号;
      rec_emp employee%rowtype;
      ex_no_comm  exception; --定义无奖金异常
    begin
      select * into rec_emp from employee where empno=v_empno;
      if (rec_emp.comm is null or rec_emp.comm=0) then
        raise ex_no_comm;--2. 抛出异常
      end if;
      --3. 异常处理
      exception
        when ex_no_comm then
          dbms_output.put_line('无奖金异常');
    end;
    /
    

    异常交给java处理(了解)

    使用SQL中的函数RAISE_APPLICATION_ERROR(error_number, error_message)即可把异常交给java处理。
    java中通过try捕获到SQLException,之后通过SQLException的getCode和getMessage方法来获得

    goto语句

    --若XXX员工的工资小于奖金的 3倍,则为该员工的工资增加30%。
    declare
      v_empno employee.empno%type;
      v_sal employee.sal%type;
      v_comm employee.comm%type;
    begin
      v_empno := &请输入员工编号;
      select sal,comm into v_sal,v_comm from employee where empno=v_empno;
      if v_sal<nvl(v_comm,0)*3 then
        goto updating;
      end if;
      
      --定义标号
      <<updating>>
         update employee set sal=sal+sal*0.3 where empno=v_empno;
         commit;
      <<quit>>
        null; --空语句,什么都不做
    end;
    /
    
  • 相关阅读:
    BZOJ.2916.[POI1997]Monochromatic Triangles(三元环)
    Codeforces.724G.Xor-matic Number of the Graph(线性基)
    BZOJ.3498.[PA2009]Cakes(三元环 枚举)
    BZOJ.3545.[ONTAK2010]Peaks(线段树合并)
    BZOJ.4919.[Lydsy1706月赛]大根堆(线段树合并/启发式合并)
    BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
    BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)
    Codeforces.547C.Mike and Foam(容斥/莫比乌斯反演)
    BZOJ.4516.[SCOI2016]幸运数字(线性基 点分治)
    页面置换算法
  • 原文地址:https://www.cnblogs.com/stars-one/p/10937827.html
Copyright © 2011-2022 走看看