След 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