Po PostgreSQL 11 zespół sterowników PostgreSQL JDBC wprowadził nazwę ENUM EscapeSyntaxCallMode w sterowniku PostgreSQL w wersji 42.2.16. Możemy użyć tego wyliczenia podczas tworzenia połączenia z bazą danych lub DataSource
obiekt. To wyliczenie ma 3 rodzaje wartości:
- "
funkcja
" - ustaw to, gdy zawsze chcemy wywoływać funkcje. - "
zadzwoń
" - ustaw to, gdy zawsze chcemy wywoływać procedury. - "
callIfNoReturn
" - Sprawdza typ zwracany w wywołaniu funkcji/procedury, jeśli istnieje typ powrotu, PostgreSQL uważa go za funkcję i wywołuje go jako sposób funkcji. W przeciwnym razie wywołuje go jako sposób procedury. Więc w moim projekcie użyłem tego "callIfNoReturn ", ponieważ chciałem, aby PostgreSQL automatycznie wykrywał, czy wywołuję funkcję, czy procedurę.
Aby rozwiązać ten problem, wystarczy wykonać poniższe czynności:
-
Zaktualizuj wersję sterownika PostgreSQL JDBC z dowolnej starszej wersji do 42.2.16 lub nowszej w
pom.xml
lub klaskać.<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency>
-
I oczywiście musisz mieć zainstalowany serwer PostgreSQL w wersji>=11, aby utworzyć procedurę.
-
Jeśli używasz Springa, to podczas tworzenia obiektu Data Source musisz dołączyć
escapeSyntaxCallMode
jako ciąg zapytania w"jdbcUrl"
tak:<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}
:tutaj wybrałem wartość wyliczenia z pliku właściwości, ale możesz bezpośrednio wpisać dowolną wartość wyliczenia wśród"func"/"call"/"callIfNoReturn"
zgodnie z Twoimi wymaganiami.
Teraz uruchom swój kod i będzie działał poprawnie.
Uwaga: Nie musisz zmieniać niczego w sposobie wywołania procedury, niezależnie od tego, czy używasz zwykłego kodu JDBC, czy @Procedure w Spring Data Jpa.
aby uzyskać więcej informacji, kliknij ten link https://github.com/pgjdbc/pgjdbc