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;
/

oracle学习笔记(十六) PL/SQL 异常和goto语句的更多相关文章

  1. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

  2. oracle学习笔记4:PL/SQL

    PL/SQL是没命名的存储过程,函数,触发器,PL/SQL块的语法格式如下: [declare] --声明部分,可选 begin --执行部分,必须 [exception] --异常处理部分,可选 e ...

  3. Oracle 学习笔记 17 -- 异常处理(PL/SQL)

    程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...

  4. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  5. Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包

    子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中.   子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...

  6. Oracle学习笔记(十二)

    十三.存储过程和存储函数1.掌握存储过程(相当于建立一个函数或者方法体,然后通过外部对其调用) 指存储在数据库中供所有程序调用的子程序叫做存储过程或存储函数. 相同点: 完成特定功能的程序 区别: 是 ...

  7. oracle学习(二)pl/sql基础

    pl/sql组成:DDL DML DCL pl/sql特点: SQL&PL/SQL编译器集成PL/SQL,支持SQL所有范围的语法 支持CASE语句和表达式 继承和动态方法释放 类型进化.属性 ...

  8. Oracle学习笔记十四 内置程序包

    扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...

  9. Oracle 学习笔记(六)

    Oracle 数据库常用的闪回sql 语句及其它操作语句: --Oracle 数据库dml sql -- 查看当前用户所拥有的表 select * from tab; --表空间,auto: 自动管理 ...

随机推荐

  1. [译]Vulkan教程(16)图形管道基础之总结

    [译]Vulkan教程(16)图形管道基础之总结 Conclusion 总结 We can now combine all of the structures and objects from the ...

  2. Jsoup解析Xml{详解}

    1:  概述 * 代码: //2.1获取student.xml的path String path = JsoupDemo1.class.getClassLoader().getResource(&qu ...

  3. Web安全测试学习笔记 - DVWA+PHP环境搭建

    DVWA(Damn Vulnerable Web Application),是一个用PHP编写的,作为Web安全测试练习平台的合法环境(毕竟咱不能为了练习就随便找个网站去攻击...),也就是俗称的靶场 ...

  4. Java方法之参数传递机制

    目录 Java方法之参数传递机制 基本数据类型 引用数据类型 综合练习 总结 Java方法之参数传递机制 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做 ...

  5. JVM内存模型与类加载机制

    一. java虚拟机的内存模型如图: 补习一下jvm内存模型中的各个组成部分 堆: 我们new出来的对象全部放在堆中,他是jvm所能够动态分配的最大的一块空间 优点: 内存动态分配,生命周期不必事先告 ...

  6. Mybatis中返回Map

    在Mybatis中,我们通常会像下边这样用: 返回一个结果 User selectOne(User user); <select id="selectOne" paramet ...

  7. C++ `endl` 与 `\n` 的区别

    std::cout << std::endl : 插入换行并刷新缓存区 (flush the buffer) std::cout << "\n" : 插入换 ...

  8. 服务器返回的数据将Unicode码转成汉字

    当我们请求接口的时候,服务器会返回一些数据,当我们打印的时候就会发现,打印出来的是unicode码,不是汉字. 这时候需要我们自己手动处理一下,让打印的时候输出汉字的格式. 方法如下: 新增一个分类, ...

  9. python创建文件夹

    import os filePath = 'D:\12345' # 判断文件夹是否存在,不存在则创建文件夹if not os.path.exists(filePath): os.makedirs(fi ...

  10. PyCharm多行同时输入

    按住ALT,用鼠标在需要的位置点击添加光标,然后输入内容即可