2017-07-10 3 views
0

1つの入力パラメータを渡しているときにストアドプロシージャが1つあります。その入力パラメータで、no_data_foundがある場合、そのエラーログテーブルにno_data_foundエラーを格納しようとする例外が発生していますが、それを行うことができません。キャプチャできませんエラーログテーブルのno_data_foundエラー

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)を使用して、テーブルに値を格納するが、常に、それは通常、正常に完了して格納します。以下の私のコード、ストアド・プロシージャ

を見つけてください。

error_logsプロシージャをコールすると、no_data_foundエラーをどのように格納することができますかをお勧めします。

+1

こんにちは、StackOverflowのへの歓迎。ヘルプページ、特に[ここではどのトピックについて聞かせていただけますか?](http://stackoverflow.com/help/on-topic)と[質問しないでください。」](http://stackoverflow.com/help/dont-ask)。さらに重要なことは、[Stack Overflow question checklist](http://meta.stackexchange.com/q/156810/204922)をお読みください。また、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)についても知りたいことがあります。 – herrbischoff

答えて

0

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; 
+0

上記のスニペットは役立ちますが、私のコードからselect.INTOの値をerror_logsテーブルにもキャプチャする必要があります。私のコードごとに、v_oppo_idを挿入する必要があります。また、error_logsテーブルに挿入する必要があります。 –

+0

私の前の質問は無視してください。あなたのスニペットが役立ち、それは働いて..ありがとう。 –

0

raiseが実行を終了し、エラーロガーへの呼び出しが到達不能であるので、呼び出し元にまで例外を渡します

exception 
    when no_data_found then 
     xxcct_error_logs(cct_error_seq.nextval, ...); 
     raise; 

exception 
    when no_data_found then 
     raise; 
     xxcct_error_logs(cct_error_seq.nextval, ...); 

最初のステップとして、私はそれを変更します

エラーロガーには多くのパラメータがあるようです。おそらく、それはそのような細部自体の大部分を理解することができます。そして、あなたが渡す必要があるのは、手続きが何をしようとしていたかの説明です。

編集:

私はあなたがエラーの前に例外の詳細について変数を読み込まことを逃しました。その時点でエラーはありませんでした。例外ハンドラで詳細を取得する必要があります。これには変数も必要ありません。理由だけではない:

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_error_logsプロシージャの内部では、sqlcode = 0であるかどうかを確認し、そうでない場合はsqlerrmを受け取ることができます。あなたがそれをしている間に、どの呼び出し者にどのシーケンスを使うかを知らせる代わりに、cct_error_seq.nextvalを世話することができます。同じことは、タイムスタンプなどなど私のログ手順、ユーザーのために行くようになります:あなたはl_messageの値を代入しているので理由は、例外の前にl_codeはデフォルトでに上昇させている

procedure msg 
    (p_message   dsl_log.message%type 
    , p_started_timestamp dsl_log.log_timestamp%type default null) 
+0

私はあなたが示唆したように例外ブロックを変更しましたが、 "ORA-0143:no_data_found"の代わりに "ORA-0000:正常、正常終了"という値を保存しています。 –

+0

エラーが出る前に 'sqlerrm'をキャプチャしていることに気付きました。だからこそ成功を報告しているのです。私はチャンスを得たときに私の答えをより詳細に更新します。 –

関連する問題