След PostgreSQL 11, екипът на драйверите на PostgreSQL JDBC въведе ENUM име EscapeSyntaxCallMode в PostgreSQL драйвер версия 42.2.16. Можем да използваме това enum, докато създаваме връзка с база данни или DataSource обект. Това преброяване има 3 типа стойности:
- "
func" - задайте това, когато винаги искаме да извикваме функции. - „
call" - задайте това, когато винаги искаме да извикваме процедури. - "
callIfNoReturn" - Той проверява за типа на връщане при извикване на функция/процедура, ако типът на връщане съществува, PostgreSQL го счита за функция и го извиква като начин на функция. В противен случай го извиква като начин на процедура. Така че в моя проект използвах това "callIfNoReturn“, тъй като исках PostgreSQL автоматично да разпознава дали извиквам функция или процедура.
Така че, за да коригирате този проблем, трябва само да следвате следните стъпки:
-
Надстройте вашата версия на PostgreSQL JDBC драйвер от която и да е по-стара версия до 42.2.16 или по-нова в
pom.xmlили gradle.<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency> -
И разбира се, трябва да имате PostgreSQL Server версия>=11 инсталирана на вашата машина, за да създадете процедура.
-
Ако използвате Spring, докато създавате обект на източник на данни, трябва да добавите
escapeSyntaxCallModeкато низ на заявка в"jdbcUrl"като това:<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}:тук избрах enum стойност от файла със свойства, но можете директно да въведете всяка enum стойност сред"func"/"call"/"callIfNoReturn"според вашите изисквания.
Сега изпълнявате своя код и той ще работи правилно.
Забележка: Не е необходимо да променяте нищо в начина на извикване на процедура, независимо дали използвате обикновен JDBC код или @Procedure в Spring Data Jpa.
за повече подробности, моля, следвайте тази връзка https://github.com/pgjdbc/pgjdbc