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,也应该插入错误日志表。请忽略我前面的问题。你的代码片段很有帮助,而且很有用。。谢谢