2016-06-09 11 views
0

Meine Orakel-Prozedur ist wie folgt, die verwendet wird, um die alten Benutzer aus der DB zu entfernen.So rufen Sie eine Oracle-Prozedur auf, die Daten mit JDBC löscht

create or replace 
PROCEDURE     UNAVAILABLE_USER (INACTIVE IN NUMBER DEFAULT 90) IS                                   CHK_ACTIVE_USER (NUMOFDAYS IN NUMBER DEFAULT 90) IS 
    //VARIABLE DECLARATIONS 
BEGIN 
LOOP 
    //SOME LOGIC TO FIND WHICH USER ACCOUNTS TO BE DELETED 
    END LOOP; 
    LOOP 
     DELETE FROM SCHEEMA.TABLE1 WHERE userid = ''id''; 
     DELETE FROM SCHEEMA.TABLE2 WHERE userid = ''id''; 
    END LOOP; 
    COMMIT; 
    END IF; 
EXCEPTION 
    WHEN OTHERS THEN 
    ROLLBACK; 
END UNAVAILABLE_USER; 

Soweit Orakel-Verfahren betroffen ist funktioniert es gut und Löschen von Daten beim Einchecken in SQL-Entwickler. Ich brauche, dass DAO Schicht aus Java auszuführen .. i wie unten um die Prozedur auszuführen versucht haben ..

connection = UserProfileDAO.getJDBCConnection(); 
CallableStatement statement = null; 
String query = "CALL " + USER_SCHEMA + ".UNAVAILABLE_USER(?)"; 
statement = connection.prepareCall(query); 
statement.setInt(1, Num_Off_Days); 
statement.executeUpdate(); 

Es ist die Bereitstellung und läuft gut, kein Problem von Java-Seite, sondern die Daten von db Seite löschen

09: 54: 37.761 INFO [com.alok.user.data.UserProfileDAO] (Pool-11-thread-1) innerhalb des delete user 09: 55: 04.250 INFO [stdout] (Pool-11 -thread-1) ANRUF USER_SCHEMA.UNAVAILABLE_USER (?)

Könnten Sie mir helfen, das Problem zu diagnostizieren und wie dies mit DB in Verbindung stand? Jede andere Lösung wäre nennenswert. Vielen Dank im Voraus.

+1

Ist die Verbindung in autoCommit Modus geht? Wenn nein, muss Ihr Code nach dem Löschen einen Commit durchführen: 'connection.commit()'; Fügen Sie diese Zeile am Ende an, sie funktioniert unabhängig von einem Autocommit-Status. – krokodilko

+0

Ja .. es ist in Auto-Commit-Modus –

+0

Ich habe auch versucht, die Auto-Commit-Modus als falsch vor der Transaktion .. das funktioniert auch nicht .. –

Antwort

0

Sieht aus, als hätten Sie ein Problem mit der JDBC-Syntax zum Aufrufen gespeicherter Prozeduren. Sie sollten die Anrufzeichenfolge mit geschweiften Klammern umgeben. Man könnte so etwas wie diese stattdessen versuchen:

connection = UserProfileDAO.getJDBCConnection(); 
String call = "{ CALL " + USER_SCHEMA + ".UNAVAILABLE_USER(?) }"; 

try (CallableStatement statement = connection.prepareCall(call)) { 
    statement.setInt(1, Num_Off_Days); 
    statement.execute(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
    // or throw something that can be handled 
    // by the code calling your DAO 
    throw new RuntimeException(e); 
} 

Dinge, die geändert wurden, umfassen:

  • Der Code jetzt try-with-resources, so dass die aufrufbaren Anweisung richtig, auch wenn eine Ausnahme ausgelöst wird geschlossen.
  • Mögliche SQLException s, die ausgelöst werden können, wenn die Anweisung ausgeführt wird, werden nun protokolliert und die Ausnahme nicht unbemerkt
+0

Ja .. Ich hatte alle genannten Code in Versuch Catch-Block gehalten .. Es gab ein Commit-Problem auf meinem Code. Die Transaktion konnte nicht bestätigen, dass sie sich im Autocommit-Modus befand und ich versuchte erneut zu committen. Vielen Dank für Ihre Lösung .. es würde auch funktionieren .. –

+0

@Alok, vielleicht könnten Sie eine kurze Antwort schreiben, die die Lösung beschreibt und es als akzeptiert markieren. –

Verwandte Themen