oracle学习笔记(十六) PL/SQL 异常和goto语句
2019-05-28 15:47
1671 查看
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; /
自定义异常
- 声明异常: 变量名 exception;
- 抛出异常: raise 变量名;
- 处理异常: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; /
相关文章推荐
- PL/SQL中GOTO语句和标签
- Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)
- Oracle(PL/SQL编程基础(PL/SQL程序块与PL/SQL语句)、异常、游标、数据类型)
- 【DB.PL/SQL】程序流程控制 —— GOTO语句
- PL/SQL 标签与GOTO语句
- ORACLE PL/SQL 也支持GOTO语句
- Oracle学习笔记(二)——在PL/SQL中执行各种SQL语句
- PL/SQL 语句块详细解说
- Oracle PL/SQL SQL语句编程
- PL/SQL异常处理方法
- PL/SQL-3 控制结构语句
- 数据库表某几列的列名是中文的,Java程序里面编程的SQL语句和Pl/Sql里面写法差异
- OCP复习 - PL/SQL(1-9) - 查询语句用法
- PL/SQL的循环语句
- SQL语句、PL/SQL语句、SQL*PLUS语句结束符号
- Oracle(22)pl/sql编程 控制结构语句
- 将SQL建表语句导入PL/SQL中文出现乱码解决方案
- Oracle PL/SQL之LOOP循环控制语句
- 问题:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用;结果:PL/SQL中不能用exists函数?
- pl/sql 中类型于SQL SERVER 的GO语句用法