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:
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.
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).
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.
Wenn es mit Ihrem JDBC-Treiber nicht funktioniert, können Sie es als String
?
,
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.
Tags und Links sql java prepared-statement jdbc