2009-06-23 9 views
1

Auszug aus dem Code mit einem Parameter Marker arbeitetAbfrage nicht mit preparedStatement

PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM sch.tab1 where col1 like lower ('ABZ') "); 
preparedStatement.executeQuery(); 

Der obige Code erfolgreich ausgeführt wird.

Aber wenn ich versuche, diese

PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM sch.tab1 where col1 like lower (?) "); 
preparedStatement.setString (myValue); 
preparedStatement.executeQuery(); 
auszuführen

Es löst eine Ausnahme. „STRING VORBEREITET WERDEN ENTHÄLT Unerlaubte Verwendung von Parameter-Markierungen

Was ist das Problem hier sein könnte?


Antwort gefunden, siehe die Kommentare

+0

Dies ist möglicherweise JDBC-Treiber abhängig. Was ist deine Datenbank? – skaffman

+1

Angesichts der Tags würde ich db2 annehmen. –

+0

@skaffman, ich benutze DB2 –

Antwort

3

Ich denke, Carlos ist auf etwas. Versuchen Sie,

SELECT * FROM sch.tab1 where col1 like lower ('' + ?) 

oder was auch immer für Zeichenfolge Verkettung Operator in Ihrer Version von SQL übergeben. Durch das Erzwingen eines Zeichenfolgenkontextes können Sie den Fehler möglicherweise beheben. Kann zusätzliche Klammern erfordern.

+0

** '' +? **, ich wusste nie, dass Sie + Operator für String in SQL verwenden können.atleast in DB2, die Sie nicht verwenden können. –

+1

Akzeptieren als 'SELECT * FROM sch.tab1 wo col1 wie low ('' ||?)' Funktioniert –

4

ich Verdächtiger das Problem ist, dass Sie nicht Funktionen direkt auf Parameter anwenden können. Gibt es einen besonderen Grund, warum Sie möchten, dass das untere Gehäuse in der Datenbank und nicht in Ihrem Code ausgeführt wird? (Ich denke an einigen möglichen Gründen kann zugegebenermaßen.) Wenn Sie das wirklich tun müssen, würde ich nur die SQL ändern:

SELECT * FROM sch.tab1 where col1 like ? 

und toLower() in Java aufrufen, vorzugsweise das entsprechende Gebietsschema, in denen Führe das untere Gehäuse aus.

+0

Derzeit i tun "PreparedStatement.setString (1, myValue.toLower());" als Arbeit um, aber Warum ist es nicht möglich mit Markern zu arbeiten? –

+0

Ich weiß es nicht - es könnte eine DB2-Einschränkung oder möglicherweise eine in ihrem JDBC-Treiber sein. Eine Alternative wäre, ein gespeichertes Proc zu erstellen, das das untere Gehäuse für Sie ... –

+1

vielleicht weil der Treiber nicht in Lage sein würde, den korrekten Datentyp für das Argument zu bestimmen ... –

0

Zum Vergleich: Ich lief in das gleiche Problem bei der Verwendung der NORMALIZE_STRING Funktion:

SELECT NORMALIZE_STRING(?, NFKD) FROM sysibm.sysdummy1 

Fehlermeldung:

THE DATA TYPE, LENGTH, OR VALUE OF ARGUMENT 1 OF NORMALIZE_STRING IS INVALID. SQLCODE=-171, SQLSTATE=42815, DRIVER=4.13.111 

mit folgenden Anweisung das Problem gelöst (CONCAT). Danke an Paul Chernoch!

SELECT search_normalize(NORMALIZE_STRING(? CONCAT G'', NFKD)) FROM sysibm.sysdummy1 

Beachten Sie das Präfix "G" für Unicode-Kompatibilität.