PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgresql 11:Błąd wywołania procedury składowanej — aby wywołać procedurę, użyj CALL, Java

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:

  1. "funkcja " - ustaw to, gdy zawsze chcemy wywoływać funkcje.
  2. "zadzwoń " - ustaw to, gdy zawsze chcemy wywoływać procedury.
  3. "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:

  1. 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>
    
  2. I oczywiście musisz mieć zainstalowany serwer PostgreSQL w wersji>=11, aby utworzyć procedurę.

  3. 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostGIS:Zapytanie o wymiary z i m (linestringzm)

  2. Jak ustawić wkładkę do utworzonego pliku Grails z kolejnym numerem sekwencji?

  3. Pobieranie wartości tagu xml w PostgreSQL

  4. Jak odczytać zawartość pliku .sql do skryptu R, aby uruchomić zapytanie?

  5. dlaczego postgres wyświetla jednocześnie błąd aktualizacji wiersza, gdy wyraźnie blokuję całą tabelę?