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
goto updating;
end if;
--定义标号
<>
update employee set sal=sal+sal*0.3 where empno=v_empno;
commit;
<>
null; --空语句,什么都不做
end;
/