Wie kann ich ein literales Fragezeichen ('?') in einer vorbereiteten JDBC-Anweisung umgehen?

7

Ich möchte ein JDBC PreparedStatement wie:

erstellen %Vor%

Wo der 1. ? ein Literal und der 2. ? ein Parameter ist. Ich könnte CHAR(63) anstelle von '?' verwenden, aber ich denke, der zusätzliche Funktionsaufruf würde die Ausführung von SQL verlangsamen. Gibt es eine Möglichkeit, dem 1. ? zu entkommen?

Bearbeiten:

Der folgende Code testet die Erklärung von dkatzel, dass das Zeichen ? in einer Zeichenfolge nicht als Markierung betrachtet wird:

%Vor%

Die Ausgabe:

%Vor%

Es scheint, dass dkatzel korrekt ist. Ich suchte die JDBC-Spezifikation und konnte keine Erwähnung finden, dass die ? -Parametermarker würde ignoriert werden, wenn sie in Anführungszeichen steht, aber die wenigen Implementierungen von PreparedStatement-Parsern, die ich gefunden habe ( MySql , c-JDBC , H2 ) scheinen alle auszuschließen Text in Anführungszeichen als Parameter-Marker.

    
Mike Godin 22.10.2014, 20:08
quelle

5 Antworten

4

Die Bedeutung von ? wird in der SQL-Spezifikation angegeben, und die JDBC-Spezifikation wird dafür auf die SQL-Spezifikation verschoben.

Ein Treiber interpretiert ein Fragezeichen in einem Literal nicht als Parameter-Platzhalter (und sollte es auch nicht), da ein Fragezeichen in einem Zeichenfolgenliteral einfach ein Zeichen im Zeichenfolgenliteral ist. Weitere Informationen finden Sie in Kapitel 5 von SQL: 2011 Foundation (ISO-9075-2: 2011).

Es ist also nicht notwendig zu fliehen (noch möglich).

    
Mark Rotteveel 24.10.2014, 20:17
quelle
7

Abhängig vom verwendeten JDBC-Treiber können Sie möglicherweise durch Hinzufügen eines weiteren Fragezeichens, z. wenn Sie PostgreSQL verwenden

Ссылка

  

In JDBC ist das Fragezeichen ( ? ) der Platzhalter für die Positionsparameter eines PreparedStatements. Es gibt jedoch eine Reihe von PostgreSQL-Operatoren, die ein Fragezeichen enthalten. Um zu verhindern, dass solche Fragezeichen in einer SQL-Anweisung als Positionsparameter interpretiert werden, verwenden Sie zwei Fragezeichen ( ?? ) als Escape-Sequenz. Sie können diese Escape-Sequenz auch in einer Anweisung verwenden, dies ist jedoch nicht erforderlich. Speziell nur in einer Anweisung kann ein einzelner ( ? ) als Operator verwendet werden.

    
bobmarksie 12.02.2016 09:49
quelle
6

Wenn es mit Ihrem JDBC-Treiber nicht funktioniert, können Sie es als String ? ,

binden %Vor%     
Elliott Frisch 22.10.2014 20:12
quelle
3

Hast du es versucht? Ich denke, zitierte Fragezeichen sind in Ordnung. Nur "blanke" Fragezeichen sollten in der vorbereiteten Anweisung ersetzt werden

    
dkatzel 22.10.2014 20:12
quelle
2

Ich habe CHR (63) in meiner Abfrage verwendet und dadurch mein Problem behoben.

Hier ist, was ich zum Beispiel getan habe: select q'[<div id=['|"]TRD_%%GEN%%['|"].*]' || chr(63) || q'[</div>]' from dual;

Dies half, die Zeichenfolge wie folgt zu erhalten: <div id=['|"]TRD_%%GEN%%['|"].*?</div>

Ich habe diese Abfrage dann in der insert-Anweisung verwendet und PreparedStatement durchlaufen. Arbeitete vollkommen gut.

Die CHR-Funktion ist eine integrierte Funktion und kann ähnlich wie andere Oracle-Funktionen verwendet werden. Sie können dies verwenden, wenn Sie wissen, dass die Abfrage nicht viele Male wiederholt wird.

    
Yogesh Sakurikar 28.04.2015 20:48
quelle

Tags und Links