Mein Java-Code ruft eine Prozedur auf, und wenn es eine Ausnahme gibt, wird es in der Java-SQLEXCEPTION abgefangen. Alles funktioniert gut, wenn es eine Ausnahme gibt, die dazu führt, dass die Prozedur gestoppt wird, aber wenn die Ausnahme die Prozedur nicht stoppt, zeigt Java den Fehler, den wir protokollieren wollen, nicht an. Hier ein Beispiel:Oracle-Ausnahme wird nicht von Java SQL-Ausnahme angezeigt, wenn Prozedur nicht beendet
Vorgehen:
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;
Das bei der Ausführung gibt die folgende Ausgabe:
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
Hier ist mein Java-Code, der die Prozedur aufruft:
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());
}
Allerdings zeigt mein Java nicht ORA-01476:
Divisor ist gleich Null-Nachricht und damit kann ich nicht log es ein. Wenn jedoch eine Ausnahme wie "say table not found" existiert, die zum Beenden der Prozedur führt, wird der Java-Code angezeigt. Wie kann ich den ORA-01476
Fehler protokollieren?
Naja, eigentlich entfernen erhöhung wird mir die Ausnahme in Java helfen, aber meine Der Client wollte wissen, ob es eine Möglichkeit gibt, die Fehlermeldung zu erfassen, wenn der Ausnahmeblock getroffen wurde und keine Ausnahme ausgelöst wird und die Prozedur fortgesetzt werden kann. Die Art, wie sie es jetzt tun, besteht darin, einen Ausgabeparameter an Java zu übergeben, wo die 'dbms_output.put_line (sqlerrm) 'vorhanden ist, um sie zu protokollieren. – Eosphorus
Also ich denke, das ist der einzige Weg, es zu tun. Wenn wir keine Ausnahme auslösen und wir wollen, dass Java es weiß, übergibt der Fehler einen out-Parameter oder löst eine Ausnahme aus und lässt SQLEXception abfangen. Gibt es einen anderen Weg, Parameter nicht einzubeziehen? – Eosphorus
Fügen Sie Fehler in eine Tabelle ein ist eine andere Option. –