oracle存储过程捕获异常
⑴ oracle 插入时报错 如何捕获该处理异常。
这种情况我遇到过,可能的原因是表A和表B中对应字段的数据值类型不同,建议检查一下。
可以用EXCEPTION 来捕获这个异常,并将捕获到的异常存储在一张表里,以便查询,这样就不会中断存储过程的执行,举例如下:
declare
...... -- 其他变量
V_ERRORCODE NUMBER; -- 错误代码
V_ERRORMSG VARCHAR2(6000); -- 错误信息
V_INFORMATION VARCHAR2(6000); -- 提示信息
begin
...... --其他sql语句
insert /*+ append */ into A select * from B;
exception
when others then
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_Information := TO_CHAR(v_ErrorCode) || v_ErrorMsg ;
insert into T_ERR(code,mgs,info) values(v_ErrorCode,v_ErrorMsg,v_Information);
commit;
end;
⑵ Oracle怎么捕获ora-00942的异常
不知道你想在什么环境下捕获,不知道你说的SQL是怎么捕获,或者你说的是脚本?
如果是在存储过程中捕获
有两个思路吧,
1、直接使用普通的异常处理,获取异常的代码,匹配是否为00942,然后就捕获到这个异常。
2、自定义异常处理,使用数据字典,首先查询数据字典中是否存在这表,如果不存在,就产生一个自定义的异常,在这个异常里你做处理。
------------------------------------------------------------------------------------
declare
myexception exception;
--表个数
v_num integer :=0;
begin
--查询表名为MY_USER表个数
SELECT count(*) into v_num FROM tabs WHERE table_name = 'MY_USER'
if v_num=0 then
raise myexception;
end if;
exception
when myexception then
raise_application_error(20001,'my exception happens');
when others then
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end
----------------------------------------------------------------------------------------
伪代码,你可以嵌到你的存储过程中去使用。
⑶ oracle如何捕获存储过程报错是哪一行
如果数据库是10g及以上版本,可以使用dbms_utility.format_error_backtrace(),这个函数能够返回错误行,可以套用以下格式:
create or replace procere prc_test(参数) is
v_no number;
begin
select no into v_no from zrp;
exception
when others then
dbms_output.put_line('SQL CODE:'||sqlcode||chr(10)||
sqlerrm||chr(10)||
dbms_utility.format_error_backtrace());
end;
这样写的好处是,当程序发成异常,呗exception捕获后,就会打印出错误信息及发生错误的行号
⑷ oracle 存储过程里面有一条update语句会造成主键冲突 如何捕获这个异常 取消这个update 继续运行
使用begin end块把update语句的异常捕获后处理一下,就只会影响条记录,而不是回滚整批数据。
⑸ 请教各位高手 oracle 存储过程 如何将获得捕获异常的内容写入一张表里
可以先定义个变量,发生异常的时候将异常信息赋值给变量,插入表的时候用变量,
日志表没给表结构,我自己重新定义了一个,测试ok。
CREATE TABLE T_LOG_ERROR
(ERR_ID NUMBER,
ERR_TIME DATE,
ERR_CODE NUMBER,
ERR_INFOR VARCHAR2(4000)
);
create or replace procere p_testone is
v number(2);
v_sqlcode number;
v_sqlerrm varchar2(4000);
begin
select 1 / 0 into v from al;
--异常处理
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
v_sqlcode :=sqlcode;
v_sqlerrm :=SUBSTR(sqlerrm, 1, 2000);
insert into t_log_error values(1,sysdate,v_sqlcode,v_sqlerrm);
commit;
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 200));
end;
执行存储过程后就可以把异常信息记录到表t_log_error了。