org.postgresql.util.PSQLException: ERREUR: erreur de syntaxe sur ou près de “$1”
Je reçois ce PSQLException:
org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
Position: 37
Lorsque j'exécute le code suivant:
ps = connection.prepareStatement("SELECT current_timestamp + INTERVAL ?;");
ps.setString(1, "30 minutes");
System.out.println(ps);
rs = ps.executeQuery();
Cependant, la println la fonction s'affiche dans la console:
SELECT current_timestamp + INTERVAL '30 minutes'
Ce que quelqu'un sait quel est le problème? La requête dans la console fonctionne très bien dans pgAdmin, donc je sais que ce n'est pas une erreur de syntaxe.
Ne fait aucune différence, le point-virgule est parfaitement valide
la requête fonctionne pour moi, c'est que c'est le code réel ou avez-vous une variable à la place de "30 minutes"
C'est le code... utilisez-vous postgresql?
Il y a un bug avec l'établissement de chaînes de caractères comme un intervalle, j'en suis sûr...
Il semble être postgresql bug
la requête fonctionne pour moi, c'est que c'est le code réel ou avez-vous une variable à la place de "30 minutes"
C'est le code... utilisez-vous postgresql?
Il y a un bug avec l'établissement de chaînes de caractères comme un intervalle, j'en suis sûr...
setString
fonctionne pour d'autres chaînes et setInt
fonctionne aussi...Il semble être postgresql bug
OriginalL'auteur Kevin Orriss | 2015-10-10
Vous devez vous connecter pour publier un commentaire.
Bien que la syntaxe
INTERVAL '30 minutes'
est valide lorsque vous écrivez SQL directement dans une console, il est en fait considéré comme un intervalle littérale et ne fonctionne pas lorsque la chaîne qui suit le motINTERVAL
n'est pas une chaîne littérale.Préparées dans PostgreSQL sont mis en œuvre sur le côté serveur à l'aide de
PREPARE
et chaque?
est vu comme une variable réelle sur le serveur. C'est aussi pourquoi il se plaint de$1
bien que vous n'avez jamais écrit un$
dans votre déclaration.Par conséquent, la syntaxe littérale ne fonctionne pas pour une déclaration préparée.
Ne laissez pas la représentation de chaîne (suite de
println
) de la déclaration préparée de vous confondre - ce n'est pas ce que le serveur voit. Le serveur voit une variable.Ainsi, vous avez besoin d'utiliser une syntaxe qui prend une chaîne de caractères (qui peut être une variable ou un littéral) et la convertit en intervalle. Par exemple
?::INTERVAL
ouCAST(? AS INTERVAL)
.C'est donc pas un bug.
ps = connection.prepareStatement("SELECT current_timestamp + ?::INTERVAL;");
Cela fonctionne comme prévu, dommage que ce n'est pas documentée dans la page JSP livre que j'ai acheté 🙂Eh bien, c'est une JSP livre, pas un PostgreSQL, je suppose. Chaque SGBD a ses propres particularités et certaines sont liées à la façon spécifique, il décide de mettre en œuvre le JDBC contrat.
Très bon point en effet... quand quelque chose ne fonctionne pas comment je m'attends, toujours prompts à pointer du doigt haha
OriginalL'auteur RealSkeptic
Je crois que c'est une Postgres bug et j'ai donc pensé à un sale hack pour contourner ce problème...
Je me demande si ce ne sera jamais corrigé?
Il devrait être downvoted, c'était une rapide/sale fixer jusqu'à ce que la réponse de la coulée. Ne doit pas créer une déclaration préparée à l'avance, et ensuite créer un autre avec le toString de la première déclaration préparée. Il fonctionne, mais ce n'est pas la bonne façon de le faire.
OriginalL'auteur Kevin Orriss