Après PostgreSQL 11, l'équipe de pilotes PostgreSQL JDBC a introduit un nom ENUM EscapeSyntaxCallMode dans la version 42.2.16 du pilote PostgreSQL. Nous pouvons utiliser cette énumération lors de la création d'une connexion à une base de données ou d'un DataSource
objet. Cette énumération a 3 types de valeurs :
- "
func
" - définissez ceci lorsque nous voulons toujours appeler des fonctions. - "
call
" - définissez ceci lorsque nous voulons toujours appeler des procédures. - "
callIfNoReturn
" - Il vérifie le type de retour lors de l'appel de la fonction/procédure, si le type de retour existe, PostgreSQL le considère comme une fonction et l'appelle comme une fonction. Sinon, il l'appelle comme une procédure. Donc, dans mon projet, j'ai utilisé ceci "callIfNoReturn
", car je voulais que PostgreSQL détecte automatiquement si j'appelle une fonction ou une procédure.
Donc, pour résoudre ce problème, il vous suffit de suivre les étapes ci-dessous :
-
Mettez à niveau votre version de pilote PostgreSQL JDBC à partir de n'importe quelle version antérieure vers 42.2.16 ou une version supérieure dans
pom.xml
ou graduel.<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency>
-
Et bien sûr, vous devez avoir la version PostgreSQL Server>=11 installée sur votre machine pour créer une procédure.
-
Si vous utilisez Spring, lors de la création de l'objet Data Source, vous devez ajouter
escapeSyntaxCallMode
sous forme de chaîne de requête dans"jdbcUrl"
comme ceci :<bean id="dataSource" parent="com.zaxxer.hikari.HikariDataSource"> <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/dev_db?escapeSyntaxCallMode=${cibase.db.app.procedureCallPolicy}"/> <property name="username" value="${cibase.db.app.user}"/> <property name="password" value="${cibase.db.app.password}"/> </bean>
?escapeSyntaxCallMode=${cibase.db.app.procedureCallPolicy}
:ici, j'ai choisi la valeur enum du fichier de propriétés, mais vous pouvez taper directement n'importe quelle valeur enum parmi"func"/"call"/"callIfNoReturn"
selon vos besoins.
Maintenant, vous exécutez votre code et il fonctionnera correctement.
Remarque : Vous n'avez pas besoin de changer quoi que ce soit dans le mode d'appel de procédure, que vous utilisiez du code JDBC brut ou @Procedure dans Spring Data Jpa.
pour plus de détails, veuillez suivre ce lien https://github.com/pgjdbc/pgjdbc