经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
oracle学习笔记(十六) PL/SQL 异常和goto语句 - Stars-one
来源:cnblogs  作者:Stars-one  时间:2019/5/29 8:48:45  对本文有异议

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的错误消息
  1. --使用预定义异常
  2. declare
  3. v_empno employee.empno%type;
  4. rec_emp employee%rowtype;
  5. begin
  6. v_empno := &请输入员工编号;
  7. select * into rec_emp from employee;-- where empno=v_empno;
  8. dbms_output.put_line('编号:'||rec_emp.empno||', 姓名:'||rec_emp.ename);
  9. --异常处理
  10. exception
  11. when NO_DATA_FOUND then --数据未找到
  12. dbms_output.put_line('数据未找到,原因:'||SQLCODE||','||SQLERRM);
  13. when TOO_MANY_ROWS THEN
  14. dbms_output.put_line('数据过多,不能给变量赋值,原因:'||SQLCODE||','||SQLERRM);
  15. when others then
  16. dbms_output.put_line('未知异常,原因:'||SQLCODE||','||SQLERRM);
  17. end;
  18. /

自定义异常

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

异常交给java处理(了解)

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

goto语句

  1. --若XXX员工的工资小于奖金的 3倍,则为该员工的工资增加30%。
  2. declare
  3. v_empno employee.empno%type;
  4. v_sal employee.sal%type;
  5. v_comm employee.comm%type;
  6. begin
  7. v_empno := &请输入员工编号;
  8. select sal,comm into v_sal,v_comm from employee where empno=v_empno;
  9. if v_sal<nvl(v_comm,0)*3 then
  10. goto updating;
  11. end if;
  12. --定义标号
  13. <<updating>>
  14. update employee set sal=sal+sal*0.3 where empno=v_empno;
  15. commit;
  16. <<quit>>
  17. null; --空语句,什么都不做
  18. end;
  19. /

原文链接:http://www.cnblogs.com/kexing/p/10937827.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号