三种抛异常
1 预定义的异常处理
异常名称 | 异常码 | 描述 |
---|---|---|
NO_DATA_FOUND | ORA-01403 | SELECT INTO 语句中没有返回任何记录 |
TOO_MANY_ROWS | ORA-01422 | SELECT INTO 语句中返回多于 1 条记录 |
异常号码,找对应的异常名字,判断抛出的异常名字,根据匹配的异常名处理;
declare
v_id varchar2(20);
begin
select id into v_id from testCusor where id ='11';
update testCusor set id ='22' where id =v_id;
exception
when NO_DATA_FOUND then
dbms_output.put_line('没有数据');
when TOO_MANY_ROWS then
dbms_output.put_line('多条数据');
when others then
dbms_output.put_line('其他错误');
end;
2 非预定义的异常处理
在declare中声明一个异常,使用pragma exception_init方法将异常和错误码进行绑定,然后对声明的异常进行处理;
declare
v_id varchar2(20);
--声明异常
myexception exception;
--将异常和错误码进行绑定
--非空约束异常码为-01400
pragma exception_init(myexception,-01400);
begin
insert into testCusor values(null,'14');
exception
--如果是声明的异常则
when myexception then
dbms_output.put_line('自定根据异常码定义的异常进行处理');
when others then
dbms_output.put_line('其他异常');
end;
3 用户自定义的异常处理
在declare中声明异常,然后在逻辑代码中使用RAISE 语句来抛出异常,在 EXCEPTION块中进行异常处理;
declare
v_temp varchar2(20);
--定义一个异常
v_exception exception;
begin
v_temp :='1';
if v_temp ='1' then
--抛出用户自定义的异常
raise v_exception;
end if;
exception
--对抛出的用户自定义的异常进行处理
when v_exception then
dbms_output.put_line('抛出异常');
when others then
dbms_output.put_line('其他异常');
end;
异常中使用SQLCODE, SQLERRM
在EXCEPTION中有这两个参数,SQLCODE是错误码,SQLERRM是错误信息,可以使用这两个参数进行记录日志;
declare
v_id varchar2(20);
--声明异常
myexception exception;
--将异常和错误码进行绑定
--非空约束异常码为-01400
pragma exception_init(myexception,-01400);
begin
insert into testCusor values(null,'14');
exception
--如果是声明的异常则
when myexception then
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
dbms_output.put_line('自定根据异常码定义的异常进行处理');
when others then
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
dbms_output.put_line('其他异常');
end;
--打印所有异常码对应的异常
CREATE TABLE errors (errnum NUMBER(4), errmsg VARCHAR2(100));
DECLARE
err_msg VARCHAR2(100);
BEGIN
/* 得到所有 ORACLE 错误信息 */
FOR err_num IN -100 .. 0 LOOP
err_msg := SQLERRM(err_num);
INSERT INTO errors VALUES(err_num, err_msg);
END LOOP;
commit;
END;
select * from errors;
来源:CSDN
作者:枉然轻狂
链接:https://blog.csdn.net/fenkanghong9779/article/details/104006622