oracle怎么获取exception信息

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

2019-10-13 · 繁杂信息太多,你要学会辨别
知道小有建树答主
回答量:1227
采纳率:100%
帮助的人:34.5万
展开全部

通过如下代码:

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内容,不能写进表里面。

greystar_cn
推荐于2018-02-28 · 知道合伙人软件行家
greystar_cn
知道合伙人软件行家
采纳数:16407 获赞数:17260
本人主要从事.NET C#方向的技术开发工作,具有10多年的各类架构开发工作经验。

向TA提问 私信TA
展开全部
--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来截取,否则输出很难看。

**/
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pieryon
2015-09-14 · 知道合伙人数码行家
pieryon
知道合伙人数码行家
采纳数:14410 获赞数:166869
获取软件设计师高级职称 万达金融最佳创新奖

向TA提问 私信TA
展开全部

通过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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-23
展开全部
我现在存储过程执行已经出了异常,我想知道出的问题在哪里,还可以查出来错误信息吗?2个办法:1。单步调试2。每段小代码前面弄个变量标志,代表执行到这里了,exception里面打印出来,就可以大概判断哪里出错就是说我之前已经发生的异常已经查不到了吗?因为我这个存储过程已经用到了生产环境。那肯定查不到啊,你又没建日志表自己保存起来。。如果用了 dbms_output.put_line(sqlerrm);怎么能查出这些信息。不好意思,数据库方面只是新手我开始认为你只是想看下本次出错的信息。。。所以这么写。你的要求满足不了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-23
展开全部
我现在存储过程执行已经出了异常,我想知道出的问题在哪里,还可以查出来错误信息吗?2个办法:1。单步调试2。每段小代码前面弄个变量标志,代表执行到这里了,exception里面打印出来,就可以大概判断哪里出错就是说我之前已经发生的异常已经查不到了吗?因为我这个存储过程已经用到了生产环境。那肯定查不到啊,你又没建日志表自己保存起来。。如果用了 dbms_output.put_line(sqlerrm);怎么能查出这些信息。不好意思,数据库方面只是新手
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式