oracle存储过程异常捕获
㈠ Oracle 如何捕获异常信息
一般写在存储过程处理异常。
exception
when others then
out_mes:=out_mes || '执行失败!因为'|| sqlcode || '错误' ;
out_mes你自己可以处理,插入日志表中 或作为输出参数。
㈡ ORACLE怎么在子存储过程中抛出异常,父存储过程捕捉子存储过程抛出的异常,有没有例子呀
把子存储过程中的异常处理去掉,父存储过程就能捕捉到异常了
㈢ Oracle 存储过程怎么抛出异常
你说的异常是什么意思?如果是,执行中的错误,那么可以用“调试”,不过需要有一个系统权限的拥护才能调试,权限好象是什么debug XXXXX。
如果说的是有时执行因为这样那样的数据问题出现的异常,那么一般都是通过exception来抛出异常的,这样的抛出的异常,你可以自己编代码,然后输入一张表内,这样就可以捕获异常了。如果1表示没有主键,2表示数据超长等等。具体的写法网上很多,这里就不写了。
㈣ oracle 存储过程里面有一条update语句会造成主键冲突 如何捕获这个异常 取消这个update 继续运行
使用begin end块把update语句的异常捕获后处理一下,就只会影响条记录,而不是回滚整批数据。
㈤ 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 存储过程 如何获得 捕获异常的内容
--通过sqlcode , sqlerrm 这两个内置变量来查看,例如:
DECLARE
--声明异常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition
v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text
BEGIN
--...
--抛出异常
IF ( ... ) THEN --(括号内填抛出异常的条件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉异常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他异常,并获得 捕获异常的内容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.
dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/
/**
sqlcode 就是错误代码
sqlerrm 就是sql错误信息。注意用substr来截取,否则输出很难看。
**/
㈦ 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 存储过程如何捕获特定异常
条件改成下面的。
if sqlcode=-1427
㈨ 请教各位高手 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了。
㈩ 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
----------------------------------------------------------------------------------------
伪代码,你可以嵌到你的存储过程中去使用。