Efter PostgreSQL 11 har PostgreSQL JDBC-driverteamet introduceret et ENUM-navn EscapeSyntaxCallMode i PostgreSQL-driverversion 42.2.16. Vi kan bruge denne enum, mens vi opretter en databaseforbindelse eller en DataSource
objekt. Denne enum har 3 typer værdier:
- "
func
" - indstil dette, når vi altid vil kalde funktioner. - "
call
" - indstil dette, når vi altid vil kalde Procedures. - "
callIfNoReturn
" - Den tjekker for returtypen i kaldende funktion/procedure, hvis returtype eksisterer, betragter PostgreSQL den som en funktion og kalder den som en funktionsmåde. Ellers kalder den den som proceduremåde. Så i mit projekt brugte jeg denne "callIfNoReturn
", da jeg ville have PostgreSQL til automatisk at registrere, om jeg kalder funktion eller procedure.
Så for at løse dette problem skal du kun følge nedenstående trin:
-
Opgrader din PostgreSQL JDBC-driverversion fra enhver ældre version til 42.2.16 eller nyere i
pom.xml
eller gradle.<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency>
-
Og selvfølgelig skal du have PostgreSQL Server version>=11 installeret på din maskine for at oprette en procedure.
-
Hvis du bruger Spring, skal du, mens du opretter datakildeobjekt, tilføje
escapeSyntaxCallMode
som en forespørgselsstreng i"jdbcUrl"
sådan her:<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}
:her valgte jeg enum-værdi fra egenskabsfilen, men du kan direkte skrive enhver enum-værdi blandt"func"/"call"/"callIfNoReturn"
i henhold til dit krav.
Nu kører du din kode, og den vil fungere korrekt.
Bemærk: Du behøver ikke at ændre noget i vejen for procedurekald, uanset om du bruger almindelig JDBC-kode eller @Procedure i Spring Data Jpa.
For flere detaljer, følg venligst dette link https://github.com/pgjdbc/pgjdbc