Na PostgreSQL 11 heeft het JDBC-stuurprogrammateam van PostgreSQL een ENUM-naam geïntroduceerd EscapeSyntaxCallMode in PostgreSQL-stuurprogramma versie 42.2.16. We kunnen deze opsomming gebruiken bij het maken van een databaseverbinding of een DataSource
object. Deze opsomming heeft 3 soorten waarden:
- "
func
" - stel dit in wanneer we altijd functies willen aanroepen. - "
call
" - stel dit in wanneer we altijd Procedures willen aanroepen. - "
callIfNoReturn
" - Het controleert het retourtype bij het aanroepen van functie/procedure, als het retourtype bestaat, beschouwt PostgreSQL het als een functie en roept het aan als een functiemanier. Anders roept het het aan als proceduremanier. Dus in mijn project gebruikte ik dit "callIfNoReturn
", omdat ik wilde dat PostgreSQL automatisch zou detecteren of ik een functie of procedure aanroep.
Om dit probleem op te lossen, hoeft u alleen de onderstaande stappen te volgen:
-
Upgrade uw PostgreSQL JDBC-stuurprogrammaversie van een oudere versie naar 42.2.16 of hoger in
pom.xml
of helling.<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency>
-
En natuurlijk moet u PostgreSQL Server-versie>=11 op uw computer hebben geïnstalleerd om een procedure te maken.
-
Als u Spring gebruikt, moet u tijdens het maken van het Data Source-object
escapeSyntaxCallMode
toevoegen als een queryreeks in"jdbcUrl"
zoals dit:<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}
:hier heb ik de enum-waarde uit het eigenschappenbestand gekozen, maar je kunt elke enum-waarde rechtstreeks typen onder"func"/"call"/"callIfNoReturn"
volgens uw vereiste.
Nu voert u uw code uit en deze zal correct werken.
Opmerking: U hoeft niets te veranderen aan de procedureaanroep, of u nu gewone JDBC-code of @Procedure gebruikt in Spring Data Jpa.
volg voor meer informatie deze link https://github.com/pgjdbc/pgjdbc