PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgresql 11:Грешка при извикване на съхранена процедура - За да извикате процедура, използвайте CALL, Java

След PostgreSQL 11, екипът на драйверите на PostgreSQL JDBC въведе ENUM име EscapeSyntaxCallMode в PostgreSQL драйвер версия 42.2.16. Можем да използваме това enum, докато създаваме връзка с база данни или DataSource обект. Това преброяване има 3 типа стойности:

  1. "func " - задайте това, когато винаги искаме да извикваме функции.
  2. call " - задайте това, когато винаги искаме да извикваме процедури.
  3. "callIfNoReturn " - Той проверява за типа на връщане при извикване на функция/процедура, ако типът на връщане съществува, PostgreSQL го счита за функция и го извиква като начин на функция. В противен случай го извиква като начин на процедура. Така че в моя проект използвах това "callIfNoReturn “, тъй като исках PostgreSQL автоматично да разпознава дали извиквам функция или процедура.

Така че, за да коригирате този проблем, трябва само да следвате следните стъпки:

  1. Надстройте вашата версия на PostgreSQL JDBC драйвер от която и да е по-стара версия до 42.2.16 или по-нова в pom.xml или gradle.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. И разбира се, трябва да имате PostgreSQL Server версия>=11 инсталирана на вашата машина, за да създадете процедура.

  3. Ако използвате 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:използване на изчислена колона в същата заявка

  2. настройка на PostgreSQL с проект django

  3. Как да създадете вложен SELECT COUNT с псевдоним в Postgres

  4. Как да влезете в postgresql db - След унищожаване на сесия (за база данни за копиране)

  5. Създайте голямо цяло число от големия край на uuid в PostgreSQL