Oracle [PreparedStatement] Klammer fehlt

turmaline

Bekanntes Mitglied
Hallo Leute, ich habe hier folgeden Code:

Java:
    public int getNumberOfWorkingDays(String start, String end) throws DAOSysException
    {
        String sqlString = "select count(*) from T_HOLIDAY where cdatestring in " +
                "(select CDATESTRING from T_HOLIDAY where CDATESTRING BETWEEN " +
                "TO_CHAR(TIMESTAMP?, 'YYYY-MM-DD') AND " +
                "TO_CHAR(TIMESTAMP?, 'YYYY-MM-DD')) and CISWEEKEND + CISHOLIDAY = 0";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        int numberOfWorkingDays = 0;

        try
        {
            stmt = prepareStatement(sqlString);
            stmt.setString(1, start);
            stmt.setString(2, end);

            rs = stmt.executeQuery();

            if(rs.first())
                numberOfWorkingDays = rs.getInt(1);
        }
        catch (DAOSysException e)
        {
            logger.exception("[getNumberOfWorkingDays]", e);
            throw(e);
        } catch (SQLException e)
        {
            logger.exception("[getNumberOfWorkingDays]", e);
            throw new DAOSysException(e);
        }
        finally
        {
            closeStatement(stmt);
            closeResultSet(rs);
        }

        return numberOfWorkingDays;
    }

Es sollte folgende Anfrage rauskommen:

SQL:
select count(*) from TWIM_HOLIDAY where cdatestring in (select CDATESTRING from TWIM_HOLIDAY where CDATESTRING BETWEEN TO_CHAR(TIMESTAMP'2012-05-09 00:00:00', 'YYYY-MM-DD') AND TO_CHAR(TIMESTAMP'2012-05-18 00:00:00', 'YYYY-MM-DD') and CISWEEKEND + CISHOLIDAY = 0)

Leider hat Oracle ein Problem mit der Interpretation von PreparedStatement.
Ich bekomme eine SQLException:

Caused by: java.sql.SQLException: ORA-00907: Rechte Klammer fehlt

Weiß jemand eine Lösung?

Gruß,
madlena
 
Zuletzt bearbeitet von einem Moderator:
C

Camino

Gast
"TO_CHAR(TIMESTAMP?, 'YYYY-MM-DD')) and CISWEEKEND + CISHOLIDAY = 0";
Muss die eine Klammer nicht ganz nach hinten?
 
S

SlaterB

Gast
die Query sollte aber auch mit dieser Klammersetzung funktionieren, abgesehen von vielleicht nicht gefundenden Attributen in anderer Tabelle?,
(edit: oh, ist sogar dieselbe Tabelle ;) )
die Fehlermeldung dazu ist mir vorerst unverständlich,

> TO_CHAR(TIMESTAMP?,
sieht auch verwegen aus, das schon irgendwo erfolgreich getestet?
vielleicht nicht gerade in einer Subquery das erste Mal verwenden

das fertige
> TO_CHAR(TIMESTAMP'2012-05-18 00:00:00', 'YYYY-MM-DD')
ist auch nicht unbedingt besser, geht das wirklich als SQL?

vielleicht
"where CDATESTRING BETWEEN ? AND ?"
ausprobieren und die Dates/ Timestamp dem PreparedStatement überlassen mit entsprechenden set-Methoden
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
du hast den SQL so im Quellcode vorgegeben,
was du an anderer Stelle vielleicht an PreparedStatement-Problemen hast, ist hier nicht nachvollziehbar,

wenn du schon meinst, auf "? and ?" verzichten zu müssen, dann versuche vielleicht nicht bizarres "TIMESTAMP?",
dann kannst du auch gleich "TIMESTAMP'2012-05-09 00:00:00'" Zeichen für Zeichen als SQL-String zusammenbauen

vielleicht reicht aber auch ein Leerzeichen zwischen TIMESTAMP und den Fragezeichen..,

------

in jedem Fall nochmal auch die Ermutigung,
so ein irres Konstrukt wenigstens möglichst ohne Nebenfehlerquellen in einer einfachen Query
"select * from x where dateY > .." oder ähnlich kurz zu testen
 

turmaline

Bekanntes Mitglied
danke für die Tipps, ich habe auch selber alles auprobiert, bevor ich hier gepostet habe, leerzeichen weg und < usw, es geht alles nicht.

am leerzeichnen lag das nicht und > mit datum als string geht das nicht
 
S

SlaterB

Gast
> ich habe auch selber alles auprobiert, bevor ich hier gepostet habe

ja wie, liegt es nun an der TIMESTAMP-Geschichte? das wäre eine wichtige Information, falls es hier nicht ganz zu Ende ist

im ersten Posting mit der Subquery gab es ja reichlich anderen Anlass für eine SQL-Fehlermeldung 'Klammer fehlt'

ist in einer Testquery
"select * from x where dateY > .." bzw. ähnlich ganz ohne Klammer bis vielleicht auf TO_CHAR()
die Fehlermeldung immer noch dieselbe?

funktioniert es, wenn du "TO_CHAR(TIMESTAMP'2012-05-18 00:00:00', 'YYYY-MM-DD')" komplett fertig in den SQL-String eintippst?
wenn nicht, funktioniert das überhaupt irgendwo, in anderen DB-Tools?
 

turmaline

Bekanntes Mitglied
> ich habe auch selber alles auprobiert, bevor ich hier gepostet habe

ja wie, liegt es nun an der TIMESTAMP-Geschichte? das wäre eine wichtige Information, falls es hier nicht ganz zu Ende ist

ja es liegt an TIMESTAMP, denn wenn ich es weg lasse und das schreibe

TO_CHAR('2012-05-18') (hier natürlich das datum als parameter ? im PreparedStatement), dann funktioniert es. Schließlich brauche ich aber kein TO_CHAR, wenn ich sowieso einen String übergeben kann, deshalb habe ich BETWEEN verwendet und beide Datumswerte als String übergegeben.

im ersten Posting mit der Subquery gab es ja reichlich anderen Anlass für eine SQL-Fehlermeldung 'Klammer fehlt'

nein, es gab überhaupt gar keinen Anlass denn so eine Anfrage kann ich ausführen:

SQL:
select count(*) from TWIM_HOLIDAY where cdatestring in (select CDATESTRING from TWIM_HOLIDAY where CDATESTRING BETWEEN TO_CHAR(TIMESTAMP '2012-05-09 12:00:00', 'YYYY-MM-DD') AND TO_CHAR(TIMESTAMP '2012-05-18 12:00:00', 'YYYY-MM-DD')) and CISWEEKEND + CISHOLIDAY = 0

es ist korrekt auch wenn man CISWEEKEND + CISHOLIDAY = 0 mit in die Klammer nehmen könnte.
So eine Anfrage kann ich also ausführen, allerdings wenn ich die Datumswerte als Parameter im PreparedStatement übergebe, bekomme ich eine Meldung dass eine Klammer fehlt. Es fehlt aber keine.

>
ist in einer Testquery
"select * from x where dateY > .." bzw. ähnlich ganz ohne Klammer bis vielleicht auf TO_CHAR()
die Fehlermeldung immer noch dieselbe?

mit TO_CHAR habe ich es nur nicht ausprobiert, nur mit < ''. In SQL-Tool bekomme ich damit keine Fehlermeldung aber auch keine Ergebnisse. Auch mit TO_CHAR (hab grad ausprobiert), obwohl da welche hätten kommen sollen.

>
funktioniert es, wenn du "TO_CHAR(TIMESTAMP'2012-05-18 00:00:00', 'YYYY-MM-DD')" komplett fertig in den SQL-String eintippst?

das habe ich nicht ausprobiert, denn ich grundsätzlich nur mit PreparedStatement arbeiten darf.

>
wenn nicht, funktioniert das überhaupt irgendwo, in anderen DB-Tools?

ja die ursprüngliche anfrage hat in einem DB-Tool (Squirrel SQL) funktioniert. Da probiere ich immer aus wenn ich so eine Anfrage bastele :)
 
S

SlaterB

Gast
auch in PreparedStatement kannst du auf ? verzichten und gewisse SQL-Bestandteile komplett vorgeben,

dass TIMESTAMP? nicht geht, besonders ohne Leerzeichen dazwischen, kann ich gut verstehen, also überrascht mich nicht,
erklären kann ich persönlich dazu aber nichts weiter (Leerzeichen ja schon erwähnt ;) ), um das nochmal abzuschließen,
aber vielleicht wer anders

wenn du Zeit hast kannst du nochmal schreiben, was beim ursprünglichen '? and ?' ganz ohne 'TO_CHAR(TIMESTAMP ' im SQL-String
die Fehlermeldung oder das sonstige Problem mit PreparedStatement ist, vielleicht ist das zu lösen
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Schon mal versucht die TO_TIMESTAMP Funktion anders einzubauen?

SQL:
TO_CHAR(TO_TIMESTAMP('2012-05-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD')

So sollte jedenfall das Binding von dem Prepared stament ohne Probleme gehen:

Java:
TO_CHAR(TO_TIMESTAMP(?, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD')
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe PreparedStatement wird nicht ausgeführt Datenbankprogrammierung 5
V SQLite NullPointerException in preparedStatement.close(); Datenbankprogrammierung 8
Neumi5694 SQL-Statement Preparedstatement - try resource vs. Garbage Collector Datenbankprogrammierung 5
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
S CSV Datein in DB übernehmen:PreparedStatement bzw executeBatch() zu langsam Datenbankprogrammierung 11
P MySQL PreparedStatement vs. StoredProcedure vs. executeBatch Datenbankprogrammierung 1
P PreparedStatement IN-Funktion Datenbankprogrammierung 8
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
C PreparedStatement und null Datenbankprogrammierung 13
J Problem bei Boolean in PreparedStatement Datenbankprogrammierung 5
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
D MySQL PreparedStatement mit c3p0 schlägt fehl. Warum? Datenbankprogrammierung 3
S Oracle Problem mit PreparedStatement.setString(1,"str") Datenbankprogrammierung 10
M MySQL preparedStatement und Anführungszeichen Datenbankprogrammierung 6
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G PreparedStatement und Transaktionen Datenbankprogrammierung 2
N Leeres Blob in ein PreparedStatement eintragen Datenbankprogrammierung 2
P PreparedStatement batch und getGeneratedKeys Datenbankprogrammierung 7
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
B H2 PreparedStatement SELECT * FROM ? Datenbankprogrammierung 4
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11
Guybrush Threepwood PreparedStatement: execute() oder executeUpdate() Datenbankprogrammierung 3
R PreparedStatement mit verschiedenen Datenbanken Datenbankprogrammierung 2
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
R Zugriff auf SQL im PreparedStatement Datenbankprogrammierung 4
W preparedStatement (MySQL - JDBC) Datenbankprogrammierung 5
Landei PreparedStatement Parameter mehrfach verwenden Datenbankprogrammierung 18
S Create Table mit PreparedStatement Datenbankprogrammierung 2
S Select mit PreparedStatement Datenbankprogrammierung 2
S PreparedStatement setArray(int i, java.sql.Array) Datenbankprogrammierung 17
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
T PreparedStatement anzeigen Datenbankprogrammierung 10
A PreparedStatement im Servlet - Referenz speichern Datenbankprogrammierung 3
P PreparedStatement - Angabe des PK Datenbankprogrammierung 4
J Fehler beim PreparedStatement Datenbankprogrammierung 2
B PreparedStatement - anzahl ParameterValues Datenbankprogrammierung 6
J PreparedStatement Datenbankprogrammierung 5
C PreparedStatement Datenbankprogrammierung 2
R DB2 PreparedStatement Batches ungültige Reihenfolge Datenbankprogrammierung 4
V PostgreSQL JDBC Treiber fehlt Datenbankprogrammierung 6
E Java Chat Datenbank fehlt Datenbankprogrammierung 9
T MySQL: Join auf sich selbst schlägt fehlt Datenbankprogrammierung 3
K Was fehlt? - No Persistence provider for EntityManager Datenbankprogrammierung 4
B Datenbank Abfrage: Es fehlt immer ein Eintrag! Datenbankprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben