Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 398|回复: 0

oracle学习笔记(十六) PL/SQL 异常和goto语句

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-24 17:52:42 | 显示全部楼层 |阅读模式

    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;
    /
    
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 00:48 , Processed in 0.073570 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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