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
エラーを記録するにはどうすればよいですか?
が、ある私のクライアントは、例外ブロックにヒットした場合にエラーメッセージをキャプチャする方法があるかどうかを知りたがっていて、例外が発生せず、プロシージャを続行できるようにしました。彼らが今やっているやり方は、 'dbms_output.put_line(sqlerrm) 'が存在するjavaに出力パラメータを渡してそれを記録することです。 – Eosphorus
だから私はそれを行う唯一の方法だと思います。例外を発生させないと、javaがoutパラメータを介してエラーを渡すか、例外を発生させてSQLEXceptionをキャッチすることがわかります。パラメタを出さない他の方法はありますか? – Eosphorus
テーブル内の挿入エラーも別のオプションです。 –