SQL Abfrage über PreparedStatement mit UPDATE in Verbindung mit EXISTS liefert Fehler

Walter91

Mitglied
Hallo liebe Forumgemeinde,

wie solls anders sein, ich hab ein Problem mit einer Aufgabe aus nem Übungsblatt für Informatik 2.
Es geht darum, dass auf dem Server der Uni eine mySQL Datenbank eingerichtet wurde und diese eine Tabelle
Hund enthält, mit Spalten: ID, name, lebensalter, besitzer
Sie wurde anhand dieser SQL-Abfrage erzeugt:
CREATE TABLE Hund
(
ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
lebensalter SMALLINT UNSIGNED NOT NULL,
besitzer VARCHAR(20),
PRIMARY KEY (ID)
);

Ziel ist es nun ein Java-Programm zu schreiben, welches eine Verbindung zur Datenbank herstellt und über Kommandozeilenparameter bestimmte Funktionalitäten bereit stellt. Die Aufgabe, die mir Probleme bereitet ist folgende:
Mit Kommandozeilenparametern der Form
-modify <id> <attributname> <attributwert>
soll eine beliebige Spalte (mit Ausnahme der ID) der Tabelle Hund modi ziert werden
konnen. Vorher muss naturlich sichergestellt werden, dass ein Tupel mit dieser ID auch
existiert. Der Benutzer soll benachrichtigt werden, falls kein Tupel mit dieser ID existiert.

Mir ist klar, dass man mit EXISTS auf Existenz prüfen kann, ich hab das auch umgesetzt, erhalte jedoch folgenden Fehler:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Der Code dazu:
Java:
package aufgabe26;

import java.sql.*;

public class Aufgabe26 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        if (args.length == 0) {
            System.out.println("Kein Kommandozeilenparameter übergeben!");
            return;
        }
        
        try {
            

        Class.forName("com.mysql.jdbc.Driver");
        
        Connection c = DriverManager.getConnection("jdbc:mysql://educos-srv01.informatik."
                + "uni-augsburg.de:3306/theDatabase", "student", "inFormatik2");
    
        Statement abfrage = c.createStatement();

        if (args[0].equals("-modify") && args.length == 4) {
            if (args[2].equals("name")) {
                int id = Integer.parseUnsignedInt(args[1]);
                PreparedStatement testID = c.prepareStatement("UPDATE Hund SET name = ? WHERE "
                        + "EXISTS (SELECT * FROM Hund WHERE ID = ?");
                testID.setString(1, args[3]);
                testID.setInt(2, id);
                testID.executeUpdate();
            }
}

catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
        catch (SQLException e ) {
            System.out.println(e.getMessage());
        }
    }
}

Ich hab die SQL Abfrage ergoogled und da wird es genauso gemacht aber irgendwie klappt es nicht.
Hat jemand eine Idee wieso und wie es funktioniert?

Verwendete IDE: Eclipse


Viele Greetz
Walter :)
 

Joose

Top Contributor
Java:
                PreparedStatement testID = c.prepareStatement("UPDATE Hund SET name = ? WHERE "
                        + "EXISTS (SELECT * FROM Hund WHERE ID = ?");

Ich hab die SQL Abfrage ergoogled und da wird es genauso gemacht aber irgendwie klappt es nicht.
Hat jemand eine Idee wieso und wie es funktioniert?

Also dieses SQL Statement schaut sehr komisch aus. Wo hast du das denn gefunden mit dem EXISTS (immer praktisch sowas zu verlinken).

Normalerweise schaut ein UPDATE Statement wie folgt aus
Code:
UPDATE
   tabelle
SET
   spaltennamen = neuerwert [, spaltennamen = neuerwert]
WHERE
   spaltenname = wert [AND spaltenname = wert]

Damit sollte es eigentlich ohne Probleme funktionieren. Die Kontrolle ob ein Datensatz überhaupt existiert ist nicht notwendig das sollte die Datenbank für dich machen. Als Rückgabewert bekommst du ein int welches dir verrät wieviele Datensätze geändert wurden. Wenn 0 geändert wurden dann ist möglicherweise kein Datensatz mit dieser ID vorhanden.
 
Zuletzt bearbeitet:

Dompteur

Top Contributor
Du hast in Zeile 30 einen Syntaxfehler im SQL.
Es fehlt die schließende Klasse deines Subselects. Also zwischen ? und "
 

Neue Themen


Oben