2012-03-29 7 views
1

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?

Antwort

3

Eigentlich werfen Sie keine Ausnahmen, Sie geben sie nur mit dbms_output Paket aus.

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

Versuchen Sie diesen Code (mit raise):

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

Dann werden Sie einige Fehler sehen, die mit SQLException im Block passiert

+0

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

+0

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

+0

Fügen Sie Fehler in eine Tabelle ein ist eine andere Option. –

2

Sie Umgang mit Ausnahme in Oracle gespeicherten Prozedur.

Deshalb wird nicht an den Client weitergegeben.

Mein Rat ist, den Ausnahmeblock in Oracle-Prozedur oder fügen Sie RAISE_APPLICATION_ERROR()

Ausnahme , wenn andere dann

dbms_output.put_line(sqlerrm); 
    RAISE_APPLICATION_ERROR(-21000,"Oops division by zero ") 
end; 
+4

Oder lege einfach eine Zeile mit RAISE; nach dem dbms_output im Exception-Handler. Das sollte die vorhandene Ausnahme zu dem nächsten äußersten Handler erneut auslösen. –