Hallo zusammen,
ich möchte meine Kenntnisse im Bereich PSQL erweitern und möchte folgendes in JDBC realisieren:
Mein Projekt ist eine Kundendatenbank. Die Kundennummern werden beim Anlegen eines neuen Kunden, von 1 aufwärts, fortlaufend vergeben. Wenn ein Kunde aus der Datenbank gelöscht wird, kann seine Nummer neu vergeben werden.
Die For-Schleife in getIndex() soll dann solange laufen bis die „Lücke“ gefunden wurde und diese Zahl dann zurückgeben oder die nächsthöhere Zahl zurückgeben, wenn alle Zahlen belegt sind. Also beispielsweise 1,2,3,4 gibt es schon, dann wird die 5 gewählt. Die Funktion checkEx(INTEGER) soll für jede Zahl prüfen ob diese schon vergeben ist.
Ich habe euch die relevanten Methoden einmal kopiert. Leider funktioniert das Ganze noch nicht so ganz. Ich vermute, dass es an der For-Schleife liegt.
Ich bin für jeden Tipp dankbar.
public static void createFunctions() throws SQLException {
stmt = conn.createStatement();
// checkEx(INTEGER)
String sqlCheckEx = "CREATE OR REPLACE FUNCTION checkEx(INTEGER) RETURNS
INTEGER AS $BODY$ " +
"DECLARE " +
"ct INTEGER; " +
"BEGIN " +
"PERFORM COUNT(1) INTO ct " +
"FROM kunde " +
"WHERE unique_key = $1; " +
"RETURN ct; " +
"END; " +
"$BODY$ LANGUAGE plpgsql; " ;
stmt.executeUpdate(sqlCheckEx);
// getIndex()
String sqlIndex = "CREATE OR REPLACE FUNCTION getIndex() RETURNS INTEGER AS $BODY$ " +
"DECLARE " +
"inx INTEGER := 1; " +
"check INTEGER := 0; " +
"BEGIN " +
"FOR i IN 1.." + getAnzKd() + " LOOP " +
//"check := checkEx(i); " +
"PERFORM 'SELECT checkEx(i) INTO check'; " +
"IF check=1 THEN inx := i; " +
"ELSE inx := " + (getAnzKd()+1) + "; " +
"END IF; " +
// "IF check=1 THEN PERFORM 'SELECT i INTO inx; " +
// "ELSE PERFORM 'SELECT (getAnzKd()+1) INTO inx; " +
// "END IF; " +
"END LOOP; " +
"RETURN inx; " +
"END; " +
"$BODY$ LANGUAGE plpgsql; ";
stmt.executeUpdate(sqlIndex);
IO.println("\n\n--> Funktionen erstellt");
}
public static boolean addKunde() throws SQLException {
IO.println("Kunde hinzufuegen");
String tempVorname, tempNachname;
IO.print("Vorname: "); tempVorname = IO.inputString();
IO.print("Nachname: "); tempNachname = IO.inputString();
Kunde kunde = new Kunde(getKdNr(), tempVorname, tempNachname);
return addKunde(kunde);
}
public static int getAnzKd() throws SQLException {
String sql = "SELECT COUNT(1) FROM kunde";
ResultSet rs = stmt.executeQuery(sql);
rs.next();
return rs.getInt(1);
}
public static int getKdNr() throws SQLException {
String sql = "SELECT * FROM getIndex(); ";
ResultSet rs = stmt.executeQuery(sql);
rs.next();
System.out.println("--->" + rs.getInt(1));
return rs.getInt(1);
}
public static boolean addKunde(Kunde kunde) throws SQLException {
stmt = conn.createStatement();
String sql = "INSERT INTO Kunde VALUES ('" + kunde.KDNR + "', '" + kunde.vorname + "', '"
+ kunde.nachname + "')";
//SQL-Befehl ausgeben
IO.printSQL(showSQL, sql);
return stmt.executeUpdate(sql) == 1 ? true : false;
}