Oracle In Datenbank Einfügen

hans-sonny

Bekanntes Mitglied
Hi leute,

ich bekomme beim einfügen in eine Datenbank folgenden Fehler:

Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-01756: Anführungsstrich fehlt bei Zeichenfolge

Ausführen tu ich folgendes:

Java:
neuerkunde = stmt.executeQuery("INSERT INTO Kunde (Kundennummer, Name, Vorname) VALUES "
                            + "(ID_Kunde.NEXTVAL" + ", '" + name + "', " + vorname + "')");
 
Vor name gehört noch ein ' hin.

so sollte es gehen.
Java:
neuerkunde = stmt.executeQuery("INSERT INTO Kunde (Kundennummer, Name, Vorname) VALUES "
                            + "(ID_Kunde.NEXTVAL" + ", '" + name + "', '" + vorname + "')");
 
ich habs so drin wie du es gesagt hast aber ist noch die gleiche fehlermeldung

Java:
        neuerkunde = stmt.executeQuery("INSERT INTO Kunde (Kundennummer, Name, Vorname) VALUES "
                            + "(ID_Kunde.NEXTVAL" + ", '" + name + "', '" + vorname + "')");


habs dann mal so geändert

Java:
        neuerkunde = stmt.executeQuery("INSERT INTO Kunde (Kundennummer, Name, Vorname) VALUES "
                            + "('ID_Kunde.NEXTVAL'" + ", '" + name + "', '" + vorname + "')");


also ID_Kunde.Nextval noch in ' ' gesetzt

dann bekomm ich die Fehlermeldung:
Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-01722: Ungültige Zahl


also ich vermute das das NEXTVAL nicht geht ...

ID_Kunde ist eine SQL Sequenz ... die mit Nextval hochgezählt werden soll
 
Zuletzt bearbeitet:
Geb mal den SQL-Befehl auf die Konsole aus.

Danach bräuchten wir das Schema in der DB zu Kunde.

ich teste auch mal immer wieder mit "normalen" SQl-Tools (z.B. squirrel) ob das Kommando so läuft oder noch fehlerhaft ist. Erst danach baue ich den Befehl in Java ein.

Und nutze lieber Prepared-Statements! zu leicht passieren Fehler beim Zusammenkleistern eines SQL-Befehls. Besser
Java:
PreparedStatement stmt = con.prepareStatement("INSERT INTO Kunde (Kundennummer, Name, Vorname) VALUES (?,?,?)");
stmt.setBigDecimal(1, ID_Kunde.NEXTVAL); // daher brauchen wir das Schema, weil wir nur raten können, wie der Primary Key aussieht.
stmt.setString(2,name );
stmt.setString(3,  vorname);
stmt.executeUpdate();
[OT]Habe ich schon mal myBATIS erwähnt ? 😉 Damit kann einfach das Kommando 1:1 aus SQL-Tool in Java übernommen werden und es wird laufen.[/OT]
 
Zuletzt bearbeitet:
😉 ja das hast du schon erwähnt.

das problem ist das ID_Kunde ne Sequenz ist ... die soll beim einfügen eins hochzählen

das klappt auf noramlem sql weg ganz gut das hab ich schon paar mal probiert^^ ...


wie kann ich denn den aktuellen wert von der Sequenz abfragen?
 
Ich vermute mal, dass das NEXTVAL nicht in ' ' gesetzt werden muss. Bei manchen DBs kann man auch einfach DEFAULT schreiben, und die ID (Primary Key) wird automatisch 1 hochgezählt. Aber stimmt, wenn man sich den SQL-Befehl mal ausgeben lässt, dann sieht man meistens ziemlich schnell den Fehler.
 
Dann lass die Sequenz ganz weg, weil da die DB automatisch einen Wert einträgt, also
SQL:
INSERT INTO Kunde (Name, Vorname) VALUES (?,?)
 
wenn ich es ohne '' mache kommt die fehler meldung dass ' fehlt ..

kann nicht irgendwie den aktuellen wert von der Sequenz abfragen? und dann in ein int casten und inkrementieren??


ich glaub nicht dass die db selber was eingträgt ...


so habs probiert da das feld not Null ist kann ich das nicht weglassen ... kundennummer muss also gefüllt werden
 
Zuletzt bearbeitet:
kann nicht irgendwie den aktuellen wert von der Sequenz abfragen? und dann in ein int casten und inkrementieren??

Nee ,nicht?

das ist ein ganz schwerer Fehler, weil nun mehrere Clients zeitgleich die Funktion zum Einfügen aufrufen und dann den falschen Wert nehmen. Das MUSS die DB selber machen!
 
Was passiert in einem SQL-Tool wenn Du den Befehl absetzt?
SQL:
INSERT INTO Kunde (Name, Vorname) VALUES ('Foo','Bar')
 
so habs probiert da das feld not Null ist kann ich das nicht weglassen ... kundennummer muss also gefüllt werden


da das nur ein studentisches projekt ist und es keinen sinnvollen verwendungszweck gibt am ende kann ich ruhig davon ausgehen dass es nur einen client geben wird.

wie frag ich die sequenz denn ab? ...

also ich muss es über die sequenz machen ... die muss erhöhet werden mit nextval
 
Zuletzt bearbeitet:
nein das ist ein normaler primärschlüssel der nicht null sein darf ...

da wir die id aber mit sequenzen hochzählen sollen ist kein auto inkrement der db eingeschalten...

es muss doch möglichsein die Sequenz um in der db mit eine select oder so zu erhöhen und dann den aktuellen wert in eine variable zu speichern und diese dann dem insert mitzugeben oder nicht?
 
In Oracle, ging doch um Oracle oder?
SQL:
CREATE SEQUENCE seq_Kunde
MINVALUE 1
START WITH 1
INCREMENT BY 1

INSERT INTO Kunde (Kundennummer, Name, Vorname) VALUES (seq_Kunde.nextval, 'Foo','Bar')
Ich habe bereits darauf hingewiesen, dass wir das Schema der DB sehen müssen. So wie oben definiert man in Oracle eine Sequenz die automatisch um 1 erhöht und im insert-Befehl siehst Du, wie die DB auf die Sequenz zugreift und den nächsthöheren Wert nimmt.
 
Ich kenn mich mit Oracle jetzt nicht so aus, aber ich vermute mal, dass du bei NEXTVAL nicht den Namen der Spalte sondern der Sequenz nehmen musst.
 
es muss doch möglich sein die Sequenz um in der db mit eine select oder so zu erhöhen und dann den aktuellen wert in eine variable zu speichern und diese dann dem insert mitzugeben oder nicht?

Von dieser Denkweise solltest Du Dich komplett trennen, wie ich schon anmerkte!!!
Diese Art der Programmierung nennt man "check-then-act" und ist IMMER schlecht.

Zwei Clients fragen den alten Seqzenz-Wert ab, beispielsweise 10 und erhöhen ihn nun auf 11. Dies bedeutet beide Clients versuchen nun einen Insert zu machen mit 11 als Kundennummer. Da ist es mehr oder weniger Zufall, welcher der beiden Clients mit einer Constraint-Verletzung auf die Nase fällt. Derartige Probleme sind schwer zu finden.

Daher muss dieses von der DB transaktionssicher für mehrere parallel laufend Clients gemacht werden.
 
also ich hab es jetzt anderst gelöst und zwar so:

neuerkunde = verbindung.prepareStatement("INSERT INTO Kunde (Kundennummer, Name, Vorname,Adressnummer) " +
"VALUES (ID_Kunde.NEXTVAL, ?, ?, ?)");
neuerkunde.setString(1, name);
neuerkunde.setString(2, vorname);
neuerkunde.setInt(3, adresse);

neuerkunde.executeUpdate();
 
also ich hab es jetzt anderst gelöst und zwar so:

neuerkunde = verbindung.prepareStatement("INSERT INTO Kunde (Kundennummer, Name, Vorname,Adressnummer) " +
"VALUES (ID_Kunde.NEXTVAL, ?, ?, ?)");
neuerkunde.setString(1, name);
neuerkunde.setString(2, vorname);
neuerkunde.setInt(3, adresse);

neuerkunde.executeUpdate();




HAB jetzt noch paar sachen ergänzt ...

Java:
  //--------------------------------------------------------------------//
        //Adresse in die Datenbank eintragen
        adressen = verbindung.prepareStatement("INSERT INTO Adresse (Adressnummer," +
                "Plz, Hausnummer, Straße, Ort__ID)" + "VALUES (ID_Adresse.NEXTVAL," +
                "?, ?, ?, ?");
        
        adressen.setInt(1, plz);
        adressen.setInt(2, hausnummer);
        adressen.setString(3, strasse);
        adressen.setInt(4, Ort__ID);
        
        //Datenbank Update ausfürhen
        adressen.executeUpdate();
        adressen.close();
        
       
        //--------------------------------------------------------------------//
        //Daten in die Datenbank schreiben.
        neuerkunde = verbindung.prepareStatement("INSERT INTO Kunde (Kundennummer, Adressnummer, Name, Vorname, "
                 + "Tel_Nr, Email, BLZ, Ktonr) " +
		 "VALUES (ID_Kunde.NEXTVAL, ID_Adresse.CURRVAL, ?, ?,?,?,?,?)");
        neuerkunde.setString(1, name);
        neuerkunde.setString(2, vorname);
        neuerkunde.setString(3, tel);
        neuerkunde.setString(4, email);
        neuerkunde.setInt(5, blz);
        neuerkunde.setInt(6, kontonr);
        //--------------------------------------------------------------------//
        //Datenbank Update ausführen
        neuerkunde.executeUpdate();
        
        neuerkunde.close();
        adressen.close();


jetzt bekomme ich in die Fehlermeldung Komma Fehlt....

wo fehlt ein komma ich finde es nicht? anscheinend in der zeile: adressen.executeUpdate();
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben