0

私のストアドプロシージャには、次のステートメントがあります

IF (sdate > sysdate)
            THEN
                RAISE exec_not_allowed;
                                returnval := sdate;

            END IF;

returnval は私のプロシージャの IN OUT パラメータです。

Java では通常、以下を使用して OUT パラメータをフェッチします。

callablestatement.getInt(2);

例外が発生した場合、Java で returnval を受け取るにはどうすればよいですか? 例外エラー コードは、JavaSQLException部分にキャプチャされます。

4

3 に答える 3

2

この状況で、なぜ例外を発生させるのですか? 実際に例外を発生させる必要があるのは、次の 2 つの状況だけです。

  1. 例外をキャッチし、呼び出し元のコードで適切に処理するつもりです。
  2. 何か問題があり、アプリケーションをクラッシュさせて書き込みたいとします。

あなたはこれらのことをしていませんし、する必要もありません。コードの実行を停止し、値を「返す」(これはプロシージャです) だけです。この場合、 を使用することをお勧めしreturnます。

returnそれを含む無名ブロックの実行を終了し、プロシージャで呼び出し元のステートメントに「制御」を返します。つまり、法案に完全に適合します。

次のコードは、return を使用して、プロシージャの実行を停止する前にパラメーターに割り当てsdateます。out「より多くのもの」は決して発生しません。

create or replace procedure my_procedure_one (returnval in out date) is
begin

   -- some stuff.
   if sdate > sysdate then
      returnval := sdate;
      -- we don-t want to continue any more if this is true.
      return;
   end if;
   -- more stuff.
end;

条件が真でない場合にのみ割り当てたいsdate場合は、これらの 2 行を入れ替えるだけです。より明確にするために、ifステートメントからそれを取り出してください。これは、すべての実行が停止されると、現時点でコードが行うことです。returnvalexec_not_allowed

create or replace procedure my_procedure_two (returnval in out date) is
begin

   -- some stuff.

   -- we don-t want to continue any more if this is true.
   if sdate > sysdate then
      return;
   end if;

   returnval := sdate;
   -- more stuff.
end;

どちらの場合でも、Java 呼び出しは同じままです。最初の手順 ( my_procedure_one) ではsdate返され、2 番目の手順では null が返さreturnvalれます。

于 2012-06-07T16:55:03.167 に答える
1

returnval:=sdate;に値を割り当てる前に例外が発生するため、あなたのケースではデッドコードです。ただし、プログラムの実行を終了したい場合は、proc呼び出しからreturnval何も取得できません。returnval

内にブロックを作成することでそれを行うことができますprocedure

CREATE OR REPLACE PROCEDURE temp(returnval IN OUT date)
IS 
BEGIN
 :
 :
 BEGIN 
   IF (sdate > sysdate) THEN
         RAISE exec_not_allowed;
   END IF;

 EXCEPTION 
  WHEN exec_not_allowed THEN 
    returnval := sdate;   --after raising an exception you can assign it like this .

  raise_application_error
      (-20145                                      --sqlcode
      ,'Exception is raised for date'||returnval   --message
      );
 END;
EXCEPTION 
 WHEN OTHERS THEN 
  -- 
END temp;
于 2012-06-07T12:34:17.387 に答える
0

例外が発生すると、プロシージャの実行が終了します。

応答を得ることができません。

于 2012-06-07T12:35:27.643 に答える