java.sql.SQLException: ORA-01722: invalid number

Br4ve

Bekanntes Mitglied
Hallo,
ich habe ein Problem mit einem Prepared Statement von mir und zwar bekomme ich immer den fehler aus dem Titel, diesen hier:
Java:
java.sql.SQLException: ORA-01722: invalid number

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:810)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
	at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:850)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3384)
	at datenbankZugriff.dbzugriff.anfragetest(dbzugriff.java:68)
	at tagHandler.test.main(test.java:16)

Der Code ist folgender:
Java:
public static ArrayList<Procstep> anfragetest(String pgid, String db){
	pgid = anfraPgids(pgid, db);
	pgid = pgid.substring(0, pgid.length()-2);
	
	System.out.println(pgid);
	ResultSet rs = null;
	PreparedStatement pstmt;
	Connection con = datenbankZugriff.dbverbindung.getConnection(db);
	ArrayList<Procstep> liste = new ArrayList<Procstep>();
	try {
		pstmt = con.prepareStatement("select process.name, processgroup.pgroupid,process.pid," +
				" processstep.seqnr, toolrelease.maincommand,processstep.status, " +
				"processstep.jobmachineid, processstep.psid, processinstance.pinid, " +
				"processstep.laststatuschange, processstep.priority, processinstance.startdate " +
				"from process,processgroup, processinstance,processstep,toolrelease where " +
				"process.pgroupid=processgroup.pgroupid and processgroup.pgroupid in (?) and " +
				"process.pid = processinstance.pid and processinstance.pinid = processstep.pinid " +
				"and processstep.treleaseid = toolrelease.treleaseid and process.name not like " +
				"'Admin %\' order by process.pid,processinstance.startdate ASC, " +
				"processstep.seqnr, processstep.psid");
		pstmt.setString(1, pgid);
		rs = pstmt.executeQuery();

Das statement ist relativ lang und deshalb wohl ziemlich unverständlich. Allerdings glaube ich auch nicht das man es verstehen muss. Ich setze hier beispielsweise foldenden String ein : pgid = "801, 614, 615, 616, 618, 619, 620, 802, 803, 804, 805, 806, 812, 813, 824, 843, 844, 869". Nun bekomme ich allerdings diesen Fehler, der meiner Recherche zufolge auftritt wenn man mit falschen Datentypen arbeitet bzw. filtern will. Das merkwürdige allerdings ist, dass wenn ich diesen String manuell einsetze direkt ins Statement, ohne die setString Methode, funktioniert es. ???:L
 
S

SlaterB

Gast
setString() wird natürlich einfache Anführungszeichen drumherum setzen,

soweit ich weiß, war kürzlich schon mal ein Thema, unterstützt PreparedStatement nichts hinsichlich Listen von Werten für IN-Abfragen,
baue also manuell zusammen, vielleicht durch eigene Methoden als quasi-Framework halbwegs gesichert,
oder wechsle auf höheres wie Hibernate, da geht das dann wieder,
(wobei ein String "801, 614, 615, 616, 618" dann auch nicht gerade die perfekte Vorgabe ist, schon auf List<Integer> zu parsen usw.)

edit:
java - PreparedStatement IN clause alternatives? - Stack Overflow
mit Link auf
JavaRanch Journal - October 2005 Volume 4 Issue 2
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
muss nicht zwingend ein Problem sein, bei mir in Oracle ist das \ einfach ein \,
oder stört zumindest die Auswertung nicht gleich mit Fehlermeldung..

zum Escapen '' schreiben, zwei Hochkommata hintereinander
 

Br4ve

Bekanntes Mitglied
Also das habe ich als Problem bislang noch nicht festgestellt, bzw hat mich nicht gestört. Ich habe allerdings in diesem Zusammenhang einen weiteren Fehler, nachdem ich über Slater's Links eine dynamische Generierung der "?" und der entsprechenden setString-Methoden versucht habe zu realisieren.
Mein Code ist nun folgender:
Java:
public static ArrayList<Procstep> anfragetest(String pgid, String db){
	ArrayList<String> listepgid = new ArrayList<String>();
	listepgid = anfraPgids(pgid, db);
	String nuofpgid = "?";
	for(String s: listepgid){
	nuofpgid += " ?";
	}
	
	nuofpgid = nuofpgid.substring(0, nuofpgid.length()-2);
	ResultSet rs = null;
	PreparedStatement pstmt;
	Connection con = datenbankZugriff.dbverbindung.getConnection(db);
	ArrayList<Procstep> liste = new ArrayList<Procstep>();
	try {
		pstmt = con.prepareStatement("select process.name, processgroup.pgroupid,process.pid," +
				" processstep.seqnr, toolrelease.maincommand,processstep.status, " +
				"processstep.jobmachineid, processstep.psid, processinstance.pinid, " +
				"processstep.laststatuschange, processstep.priority, processinstance.startdate " +
				"from process,processgroup, processinstance,processstep,toolrelease where " +
				"process.pgroupid=processgroup.pgroupid and processgroup.pgroupid in ( " + nuofpgid + " ) and " +
				"process.pid = processinstance.pid and processinstance.pinid = processstep.pinid " +
				"and processstep.treleaseid = toolrelease.treleaseid and process.name not like " +
				"'Admin %\' order by process.pid,processinstance.startdate ASC, " +
				"processstep.seqnr, processstep.psid");
		int i = 1;
		for(String s: listepgid){
			pstmt.setString(i++, s);	
			
		}
		rs = pstmt.executeQuery();

jez bekomme ich wieder so eine schöne Oracle Fehlermeldung:

Java:
java.sql.SQLException: ORA-01745: invalid host/bind variable name

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:810)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
	at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:850)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3384)
	at datenbankZugriff.dbzugriff.anfragetest(dbzugriff.java:77)
	at tagHandler.test.main(test.java:16)

Das bedeutet doch, dass ich bestimmte Variablennamen nicht benutzen darf. Und müsste meines Wissens "nuofpgid" betreffen. Allerdings verstehe ich nicht wieso das hier ein Problem ist.
 
S

SlaterB

Gast
immer noch setzt setString() Anführungszeichen, was nach deinem vorherigen erfolgreichen Test nicht anzuraten ist,
benutze setInteger/ setLong, was immer da ist, jedenfalls kein String,
die gegebenen Strings parsen, oder gleich bei Gewinnung umstellen

welchen Datentyp hat pgroupid?

dieses Vorgehen mit vielen ? finde ich nicht so toll, eine gewisse Sicherheit kann man aber wohl nicht absprechen,
beim Zusammenbau in der Schleife ist StringBuilder zu empfehlen,
aber das ist schon nur noch kleiner Performance-Tipp, andererseits ein wichtiger, lohnt sich durchaus zu lernen,

genauso allgemein zu verbessern:
Java:
ArrayList<String> listepgid = new ArrayList<String>();
listepgid = anfraPgids(pgid, db);
wird entweder zu
Java:
ArrayList<String> listepgid = null;
listepgid = anfraPgids(pgid, db);
oder
Java:
ArrayList<String> listepgid;
listepgid = anfraPgids(pgid, db);
oder gleich
Java:
ArrayList<String> listepgid = anfraPgids(pgid, db);
die erzeugte Liste bei dir wird jedenfalls gleich weggeworfen, ein neuer Rückgabewert in die Variable geschrieben,

List statt ArrayList als Typ der Variablen auch wieder empfehlenswert
 

Br4ve

Bekanntes Mitglied
Hm danke für deine Antwort ja eigentlich kann ich hier auch einfach Integer benutzen jetzt das dürfte kein Problem sein.
Wenn ich dich richtig verstehe, ist also diese Schreibweise die beste:
Java:
ArrayList<String> listepgid = anfraPgids(pgid, db);
Ist das so richtig? :rtfm:
Abschließend stellt sich mir dann noch die Frage wieso ist hier List ArrayList vorzuziehen? Was hat die List gegenüber der ArrayList für Vorteile?
 
S

SlaterB

Gast
der Rückgabewert von anfraPgids() sollte auch List sein, soweit wie überall vertretbar,
grundsätzlich könnte eine Methode dann die Liste wechseln, z.B. auf LinkedList, oder Datenbanken liefern oftmals komplizierte internere List-Klassen, die bei Zugriff erst noch einen Proxy initialisieren, Daten nachladen usw.,
bei diesem Wechsel wäre das Restprogramm unberührt, wenn gut programmiert

kurz: die Information ArrayList bringt dir keinen Vorteil, schränkt dich nur ein, es reicht wenn es eine beliebige List ist, das Interface bietet alle nötigen Methoden
 

Br4ve

Bekanntes Mitglied
Leider funktioniert da irgendwas immernoch nicht, vielleicht liegt es an den Temperaturen, dass es mir einfach nicht auffällt. Ich habe eigentlich alles umgesetzt was du mir empfohlen hast, denke ich.
Hier mein Code:
Java:
public static ArrayList<Procstep> anfragetest(String pgid, String db){
	int intpgid;
	intpgid = Integer.parseInt(pgid);
	System.out.println(intpgid);
	java.util.List<Integer> listepgid = anfraPgids(intpgid, db);
	String nuofpgid = "?";
	for(Integer s: listepgid){
	nuofpgid += " ?";
	}
	
	nuofpgid = nuofpgid.substring(0, nuofpgid.length()-2);
	ResultSet rs = null;
	PreparedStatement pstmt;
	Connection con = datenbankZugriff.dbverbindung.getConnection(db);
	ArrayList<Procstep> liste = new ArrayList<Procstep>();
	try {
		pstmt = con.prepareStatement("select process.name, processgroup.pgroupid,process.pid," +
				" processstep.seqnr, toolrelease.maincommand,processstep.status, " +
				"processstep.jobmachineid, processstep.psid, processinstance.pinid, " +
				"processstep.laststatuschange, processstep.priority, processinstance.startdate " +
				"from process,processgroup, processinstance,processstep,toolrelease where " +
				"process.pgroupid=processgroup.pgroupid and processgroup.pgroupid in ( " + nuofpgid + " ) and " +
				"process.pid = processinstance.pid and processinstance.pinid = processstep.pinid " +
				"and processstep.treleaseid = toolrelease.treleaseid and process.name not like " +
				"'Admin %\' order by process.pid,processinstance.startdate ASC, " +
				"processstep.seqnr, processstep.psid");
		int i = 1;
		for(Integer s: listepgid){
			pstmt.setInt(i++, s);	
			
		}
		rs = pstmt.executeQuery();

Bei der Instanziierung der List bin ich mir nicht sicher ob das so richtig ist.
Jedenfalls bekomme ich immernoch folgenden Fehler:
Java:
java.sql.SQLException: ORA-01745: invalid host/bind variable name

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:810)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
	at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:850)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3384)
	at datenbankZugriff.dbzugriff.anfragetest(dbzugriff.java:79)
	at tagHandler.test.main(test.java:16)

Den bekomme ich allerdings auch wenn ich als Liste die ArrayList benutze. Der String nuofpgid muss doch so bleiben oder nicht? Daraus kann ich doch kein Integer machen!?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
laxla123 If-else Java Java Basics - Anfänger-Themen 4
RashAGhul Java Verwaltungstool Erstellen mit kaum Wissen Java Basics - Anfänger-Themen 9
S Substring in java Java Basics - Anfänger-Themen 3
Z Operatoren Java Applikation Java Basics - Anfänger-Themen 8
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2
sasnitzer java augensumme von zwei würfeln ist 1 Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben