java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 20.08.2012, 09:47   #1 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 06.12.2009
Fachbeiträge: 105
Abgegebene Danke: 20
Erhielt 0 Danke für 0 Beiträge
Standard java.sql.SQLException: ORA-01722: invalid number

Hallo,
ich habe ein Problem mit einem Prepared Statement von mir und zwar bekomme ich immer den fehler aus dem Titel, diesen hier:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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.
Br4ve ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.08.2012, 09:50   #2 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.629
Abgegebene Danke: 0
Erhielt 2.564 Danke für 2.525 Beiträge
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
__________________
Hansa wird Meister.

Geändert von SlaterB (20.08.2012 um 09:53 Uhr)
SlaterB ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Br4ve (20.08.2012)
Alt 20.08.2012, 10:40   #3 (permalink)
Projektleiter MyOggRadio
Team MyOggRadio
 
Registriert seit: 20.04.2005
Fachbeiträge: 925
Abgegebene Danke: 10
Erhielt 56 Danke für 56 Beiträge
Zitat:
"'Admin %\'
Das ' Zeichen tritt hier zweimal auf. Was ich nicht verstehe, ist warum es einmal escaped wird und das andere mal nicht.
__________________
http://www.myoggradio.org
homer65 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.08.2012, 11:04   #4 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.629
Abgegebene Danke: 0
Erhielt 2.564 Danke für 2.525 Beiträge
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
__________________
Hansa wird Meister.
SlaterB ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.08.2012, 11:36   #5 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 06.12.2009
Fachbeiträge: 105
Abgegebene Danke: 20
Erhielt 0 Danke für 0 Beiträge
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 Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.
Br4ve ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.08.2012, 11:45   #6 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.629
Abgegebene Danke: 0
Erhielt 2.564 Danke für 2.525 Beiträge
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 Code: Quelltext in neuem Fenster öffnen
1
2
ArrayList<String> listepgid = new ArrayList<String>();
listepgid = anfraPgids(pgid, db);
wird entweder zu
Java Code: Quelltext in neuem Fenster öffnen
1
2
ArrayList<String> listepgid = null;
listepgid = anfraPgids(pgid, db);
oder
Java Code: Quelltext in neuem Fenster öffnen
1
2
ArrayList<String> listepgid;
listepgid = anfraPgids(pgid, db);
oder gleich
Java Code: Quelltext in neuem Fenster öffnen
1
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
__________________
Hansa wird Meister.
SlaterB ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Br4ve (20.08.2012)
Alt 20.08.2012, 11:56   #7 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 06.12.2009
Fachbeiträge: 105
Abgegebene Danke: 20
Erhielt 0 Danke für 0 Beiträge
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 Code: Quelltext in neuem Fenster öffnen
1
ArrayList<String> listepgid = anfraPgids(pgid, db);
Ist das so richtig?
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?
Br4ve ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.08.2012, 12:00   #8 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.629
Abgegebene Danke: 0
Erhielt 2.564 Danke für 2.525 Beiträge
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
__________________
Hansa wird Meister.
SlaterB ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Br4ve (20.08.2012)
Alt 20.08.2012, 12:57   #9 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 06.12.2009
Fachbeiträge: 105
Abgegebene Danke: 20
Erhielt 0 Danke für 0 Beiträge
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 Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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!?
Br4ve ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.08.2012, 13:00   #10 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 31.629
Abgegebene Danke: 0
Erhielt 2.564 Danke für 2.525 Beiträge
die ? müssen durch Komma getrennt werden
__________________
Hansa wird Meister.
SlaterB ist gerade online  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
OpenGTS DeviceCommandHandler ghostship Allgemeine Java-Themen 5 06.03.2012 17:16
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state yerl Datenbankprogrammierung 2 14.12.2011 14:51
In Römische Zahlen umwandeln Eyian Hausaufgaben 25 10.11.2011 09:13
imaginäre und komplexe Zahlen alfst Java Basics - Anfänger-Themen 1 06.09.2008 23:08
tage ausrechnen unwissende Java Basics - Anfänger-Themen 4 30.01.2005 12:02


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de