oracle怎么获取exception信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle怎么获取exception信息相关的知识,希望对你有一定的参考价值。

之前项目写了个存储过程,对异常的处理很粗略,现在出了问题,想查看是不是这个异常出了问题,不知道oracle有没有自动记录异常到日志文件,如果有,怎么获取。 EXCEPTION WHEN OTHERS THEN STATE:=0; ROLLBACK;

通过如下代码:

public static String getExceptionAllinformation(Exception ex)

        String sOut = "";

        StackTraceElement[] trace = ex.getStackTrace();

        for (StackTraceElement s : trace)

            sOut += "\\tat " + s + "\\r\\n";

       

        return sOut;

 

扩展资料:

注意事项

oracle存储过程,可以通过sqlcode 获取异常编码、通过sqlerrm获取异常信息。

例子:

create or replace procedure write2blob(p_id        in number, --id

p_blob_data in blob,

p_msg       out varchar2) --数据

is

v_lobloc     blob; --目标blob

v_blob_data blob; --作为接受参数的字段,参数变量不能直接拿来赋值

v_amount     binary_integer; --总长度

v_sub_length binary_integer; --一次读取的最大长度,不超过32766

v_sub_blob   blob; --一次读取的子串

v_offset     binary_integer; --游标

v_err_msg    varchar2(1000); 

v_id         binary_integer; --要修改或新增的记录ID

v_temp       binary_integer; --临时变量用于判断是否有v_id对应的记录begin

v_amount     := length(p_blob_data);

v_blob_data  := p_blob_data;

v_sub_length := 32767;

v_offset     := 1;

v_id         := p_id;

v_temp       := 0;  --execute immediate v_query_string into v_lobloc;

select count(1) into v_temp from a where id = v_id;  --查询是否有v_id对应的记录,并且赋值给v_te/*注意:无论是修改还是新增,blob字段都需要用empty_blob()进行初始化,否则后边的blob内容,不能写进表里面。

参考技术A --1.通过RAISE弹出框(调试时使用)
--2.通过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来截取,否则输出很难看。

**/
参考技术B

通过dbms_utility.format_error_backtack获取异常信息输出错误信息:

CREATE OR REPLACE PROCEDURE ndf_exception AS

    ------------------------------------------

    --Date:

    --Author:阿金-jean

    --Description: NO_DATA_FOUND FOR Practice ORACLE EXCEPTION

    ------------------------------------------


    v_sqlcode   NUMBER(10);

    v_sqlerr    VARCHAR2(500);

    v_backtrace VARCHAR2(500);

BEGIN

    dbms_output.put_line('OUTPUT EXCEPTION INFOS:');

    RAISE no_data_found;


EXCEPTION

    WHEN no_data_found THEN

        --获取异常信息

        v_sqlcode := SQLCODE;

        v_sqlerr := SQLERRM;

        v_backtrace := dbms_utility.format_error_backtrace;

        dbms_output.put_line(' SQLCODE >> ' || v_sqlcode || chr(13) ||

                             ' SQLERRM >> ' || v_sqlerr || chr(13) ||

                             ' BACKTRACE >> ' || v_backtrace);

    WHEN OTHERS THEN

        NULL;

END;



DECLARE

    ------------------------------------------

    --Date:

    --Author:

    --Description:测试块

    ------------------------------------------

BEGIN


    ndf_exception;


EXCEPTION

    WHEN OTHERS THEN

        NULL;

END;

 下面是获取backtrace的结果:

OUTPUT EXCEPTION INFOS:

  SQLCODE >> 100

  SQLERRM >> ORA-01403: 未找到任何数据

  BACKTRACE >> ORA-06512: 在 "ENDS3.NDF_EXCEPTION", line 13

从上面可以看出输出的错误信息,通过获取dbms_utility的format_error_strace和format_error_backtrace都可以获取到异常的异常的堆栈信息,但2这有稍微的差别:

BACKTRACE >> ORA-06512: 在 "ENDS3.NDF_EXCEPTION", line 13

STRACK >> ORA-01403: 未找到任何数据

注:这里是直接使用raise no_data_found抛出异常,因此strack的错误信息和SQLERRM一样,如果实在程序中应该是类似于这种:ORA-06512: at line 13

参考技术C 我现在存储过程执行已经出了异常,我想知道出的问题在哪里,还可以查出来错误信息吗?2个办法:1。单步调试2。每段小代码前面弄个变量标志,代表执行到这里了,exception里面打印出来,就可以大概判断哪里出错就是说我之前已经发生的异常已经查不到了吗?因为我这个存储过程已经用到了生产环境。那肯定查不到啊,你又没建日志表自己保存起来。。如果用了 dbms_output.put_line(sqlerrm);怎么能查出这些信息。不好意思,数据库方面只是新手我开始认为你只是想看下本次出错的信息。。。所以这么写。你的要求满足不了。 参考技术D 我现在存储过程执行已经出了异常,我想知道出的问题在哪里,还可以查出来错误信息吗?2个办法:1。单步调试2。每段小代码前面弄个变量标志,代表执行到这里了,exception里面打印出来,就可以大概判断哪里出错就是说我之前已经发生的异常已经查不到了吗?因为我这个存储过程已经用到了生产环境。那肯定查不到啊,你又没建日志表自己保存起来。。如果用了 dbms_output.put_line(sqlerrm);怎么能查出这些信息。不好意思,数据库方面只是新手

oracle中怎么获得sql语句的错误信息

参考技术A 有一种办法,可以对表进行审计。
init文件的参数必须:
audit_trail=DB
比如:

用user用户登陆.打算对表user.test的插入操作做审计.
操作如下:
audit insert on user.test;

执行你的语句:
insert into test values (....);
查询sql执行情况:
select * from sys.aud$;本回答被提问者和网友采纳
参考技术B oracle中获得sql语句的错误信息需要通过捕获异常来实现。
比如在一个存错过程中,需要有exception 块:
begin
...
exception
when others then
out_mes:=out_mes || '执行失败!因为'|| sqlcode || '错误' ;
out_mes自定义错误提示,插入日志表中 或作为输出参数。
end;

以上是关于oracle怎么获取exception信息的主要内容,如果未能解决你的问题,请参考以下文章

python 捕捉错误,exception,traceback和sys.exc_info()比较

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2059, "Authentication pl

使用 throws Exception 获取函数的堆栈跟踪 [重复]

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Exception

16. nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecogniz

SOAP Exception:com.ctc.wstx.exc.WstxParsingException: Unexpected close tag ; expected .