2012-03-29 14 views
1

Javaコードがプロシージャを呼び出し、例外がある場合はjava SQLEXCEPTIONにキャッチされます。プロシージャを停止させる例外がある場合はすべて正常に動作しますが、例外がプロシージャを停止しない場合は、Javaがログに記録するエラーを表示しません。次に例を示します。プロシージャが停止しないときにJava例外によってJava例外が表示されない

手順:実行は次の出力を与えるとき

create or replace procedure test_jdbc(Table_name IN VARCHAR2) is 

    v_sql VARCHAR2(50); 
    cursor c_test is 
    select employee_id, employee_num from employee where rownum < 11; 
    v_test c_test%rowtype; 
BEGIN 

    for v_test in c_test loop 
    begin 
     dbms_output.put_line(v_test.employee_id || ' - ' || 
          v_test.employee_num); 
     dbms_output.put_line('c_test%rowcount - ' || c_test%rowcount); 
     if c_test%rowcount = 8 then 
     v_sql := v_test.employee_id/0; 
     end if; 
    exception 
     when others then 

     dbms_output.put_line(sqlerrm); 

    end; 

    end loop; 

end test_jdbc; 

これは:

0 - 1 
c_test%rowcount - 1 
0 - 2 
c_test%rowcount - 2 
0 - 3 
c_test%rowcount - 3 
0 - 4 
c_test%rowcount - 4 
0 - 5 
c_test%rowcount - 5 
0 - 6 
c_test%rowcount - 6 
0 - 7 
c_test%rowcount - 7 
0 - 8 
c_test%rowcount - 8 
ORA-01476: divisor is equal to zero 
0 - 9 
c_test%rowcount - 9 
0 - 10 
c_test%rowcount - 10 

PL/SQL procedure successfully completed 

ここに私のJavaコードは、プロシージャを呼び出すことです:

String insertStoreProc = "{call test_jdbc(?)}"; 

     try { 
      dbConnection = getDBConnection(); 
      callablestatement = dbConnection.prepareCall(insertStoreProc); 

      callablestatement.setString(1, "Employee"); 

      // execute select SQL stetement 

      callablestatement.execute(); 
      System.out.println("Procedure Complete!"); 




     } catch (SQLException e) { 

      e.printStackTrace(System.err); 
      System.err.println("SQLState: " + 
       ((SQLException)e).getSQLState()); 

      System.err.println("Error Code: " + 
       ((SQLException)e).getErrorCode()); 

      System.err.println("Message: " + e.getMessage()); 



     } 

しかし、私のJavaはORA-01476:の除数がゼロのメッセージと等しいので、私は表示できませんそれを記録する。しかし、プロシージャを終了させる原因となるテーブルが見つからないという例外があると、javaコードはそれを表示します。 ORA-01476エラーを記録するにはどうすればよいですか?

答えて

3

実際に例外をスローしているわけではなく、ただdbms_outputパッケージで出力しています。

begin 
    -- my stuff 
when others then 
    dbms_output.put_line(sqlerrm); -- here is just a output, procedure will continue 
end; 

raiseで)このコードを試してみてください。

begin 
    -- my stuff 
when others then 
    dbms_output.put_line(sqlerrm); 
    raise; 
end; 

を次に、あなたは、Oracleのストアドプロシージャで例外を処理しているSQLException

+0

が、ある私のクライアントは、例外ブロックにヒットした場合にエラーメッセージをキャプチャする方法があるかどうかを知りたがっていて、例外が発生せず、プロシージャを続行できるようにしました。彼らが今やっているやり方は、 'dbms_output.put_line(sqlerrm) 'が存在するjavaに出力パラメータを渡してそれを記録することです。 – Eosphorus

+0

だから私はそれを行う唯一の方法だと思います。例外を発生させないと、javaがoutパラメータを介してエラーを渡すか、例外を発生させてSQLEXceptionをキャッチすることがわかります。パラメタを出さない他の方法はありますか? – Eosphorus

+0

テーブル内の挿入エラーも別のオプションです。 –

2

とブロックで起こったいくつかのエラーが表示されます。

これは、クライアントに伝播されない理由です。

私のアドバイスは、RAISE_APPLICATION_ERROR()

例外 をOracleプロシージャで例外ブロックを削除または追加する際に他人その後、

dbms_output.put_line(sqlerrm); 
    RAISE_APPLICATION_ERROR(-21000,"Oops division by zero ") 
end; 
まあ、実際に私はJavaで例外を得るのを助けるために起こっている上げる
+4

RAISEを含む行を挿入するだけです。例外ハンドラのdbms_outputの後に指定します。既存の例外を次の最も外側のハンドラに再発行する必要があります。 –

関連する問題