Sql 无法捕获无数据\u在错误日志表中发现错误
当我传递一个输入参数时,我有一个存储过程。使用该输入参数,如果找不到任何数据,则我将引发异常,试图在该错误日志表中存储“找不到数据”错误,但我无法执行此操作。请在下面找到我的代码 存储过程:Sql 无法捕获无数据\u在错误日志表中发现错误,sql,oracle,plsql,Sql,Oracle,Plsql,当我传递一个输入参数时,我有一个存储过程。使用该输入参数,如果找不到任何数据,则我将引发异常,试图在该错误日志表中存储“找不到数据”错误,但我无法执行此操作。请在下面找到我的代码 存储过程: create or replace procedure dumm_proc (p_opportunity_number cct_opportunity.opportunity_number%type) as v_oppo_id varchar2(50); l_message varchar2(50) :=
create or replace procedure dumm_proc (p_opportunity_number cct_opportunity.opportunity_number%type)
as
v_oppo_id varchar2(50);
l_message varchar2(50) := sqlerrm;
l_code varchar2(50) := sqlcode;
begin
select opportunity_id into v_oppo_id
from cct_opportunity
where opportunity_number = p_opportunity_number;
exception
when no_data_found then
raise;
xxcct_error_logs(cct_error_seq.nextval,null,v_oppo_id,null,null,l_message,l_code,'dumm_proc',null,sysdate,user,sysdate,user);
when others then
xxcct_error_logs(cct_error_seq.nextval,null,v_oppo_id,null,null,l_message,l_code,'dumm_proc',null,sysdate,user,sysdate,user);
end;
使用另一个错误日志过程(xxcct_error_logs)将值存储到表中,但始终以正常、成功的完成方式进行存储
请建议如何通过调用错误日志过程来存储未发现错误的数据。
raise
结束执行并将异常传递回调用方,因此无法调用错误日志:
exception
when no_data_found then
raise;
xxcct_error_logs(cct_error_seq.nextval, ... );
作为第一步,我将其更改为:
exception
when no_data_found then
xxcct_error_logs(cct_error_seq.nextval, ... );
raise;
错误记录器似乎有很多参数。也许它可以自己弄清楚这些细节中的大部分,而您所需要传递的只是一个过程试图做什么的描述
编辑:
我没有注意到您在错误发生之前为异常详细信息填充了变量。在那一点上没有错误。您需要在异常处理程序中捕获详细信息。你甚至不需要变量。为什么不只是:
xxcct_error_logs
( cct_error_seq.nextval
, null
, v_oppo_id
, null
, null
, sqlerrm -- Just capture sqlerrm here
, sqlcode
, 'dumm_proc'
, null
, sysdate
, user
, sysdate
, user );
或者更简单,根本不要通过。在xxcct\u错误日志
过程中,它可以检查sqlcode=0
,如果没有,它可以拾取sqlerrm
。当您使用时,您可以让它处理cct\u error\u seq.nextval
,而不是要求每个调用方都知道要使用什么序列;用户、时间戳等也是如此。我的日志过程如下所示:
procedure msg
( p_message dsl_log.message%type
, p_started_timestamp dsl_log.log_timestamp%type default null )
原因是因为您正在分配l_消息的值,在引发异常之前的l_代码默认情况下,executon始终是正常的。希望这个片段能有所帮助
CREATE OR REPLACE
PROCEDURE dumm_proc(
p_opportunity_number cct_opportunity.opportunity_number%type)
AS
v_oppo_id VARCHAR2(50);
l_message VARCHAR2(50) := sqlerrm;
l_code VARCHAR2(50) := SQLCODE;
BEGIN
SELECT opportunity_id
INTO v_oppo_id
FROM cct_opportunity
WHERE opportunity_number = p_opportunity_number;
EXCEPTION
WHEN no_data_found THEN
-- raise;
l_message:=SQLERRM;
l_code :=SQLCODE;
xxcct_error_logs(cct_error_seq.nextval,NULL,v_oppo_id,NULL,NULL,l_message,l_code,'dumm_proc',NULL,sysdate,USER,sysdate,USER);
WHEN OTHERS THEN
l_message:=SQLERRM;
l_code :=SQLCODE;
xxcct_error_logs(cct_error_seq.nextval,NULL,v_oppo_id,NULL,NULL,l_message,l_code,'dumm_proc',NULL,sysdate,USER,sysdate,USER);
END;
下面的代码片段便于理解
SET serveroutput ON;
DECLARE
l_message VARCHAR2(100):=SQLERRM;
l_code VARCHAR2(100):=SQLCODE;
BEGIN
dbms_output.put_line(l_message||'-->'||l_code);
END;
--Now raising exception forcefully
SET serveroutput ON;
DECLARE
l_message VARCHAR2(100):=SQLERRM;
l_code VARCHAR2(100):=SQLCODE;
l_var PLS_INTEGER;
BEGIN
BEGIN
l_var:='abc';
EXCEPTION
WHEN VALUE_ERROR THEN
l_message:=SQLERRM;
l_code :=SQLCODE;
END;
dbms_output.put_line(l_message||'-->'||l_code);
END;
大家好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。我已经按照您的建议更改了异常块,但它的存储值仍然是“ORA-0000:正常,成功完成”,而不是“ORA-0143:未找到数据”。注意到您在出现任何错误之前捕获了
sqlerrm
。这就是它报告成功的原因。当我有机会的时候,我会用更多的细节更新我的答案。上面的代码片段有帮助,但只有一个疑问,从我的代码中,我需要将select..捕获到我的error_logs表中的值中。。。。根据我的代码,我需要插入v_oppo_id,也应该插入错误日志表。请忽略我前面的问题。你的代码片段很有帮助,而且很有用。。谢谢