sql >> Database >  >> RDS >> PostgreSQL

Postgresql 11:Opgeslagen procedure-aanroepfout - Om een ​​procedure aan te roepen, gebruikt u CALL, Java

Na PostgreSQL 11 heeft het JDBC-stuurprogrammateam van PostgreSQL een ENUM-naam geïntroduceerd EscapeSyntaxCallMode in PostgreSQL-stuurprogramma versie 42.2.16. We kunnen deze opsomming gebruiken bij het maken van een databaseverbinding of een DataSource object. Deze opsomming heeft 3 soorten waarden:

  1. "func " - stel dit in wanneer we altijd functies willen aanroepen.
  2. "call " - stel dit in wanneer we altijd Procedures willen aanroepen.
  3. "callIfNoReturn " - Het controleert het retourtype bij het aanroepen van functie/procedure, als het retourtype bestaat, beschouwt PostgreSQL het als een functie en roept het aan als een functiemanier. Anders roept het het aan als proceduremanier. Dus in mijn project gebruikte ik dit "callIfNoReturn ", omdat ik wilde dat PostgreSQL automatisch zou detecteren of ik een functie of procedure aanroep.

Om dit probleem op te lossen, hoeft u alleen de onderstaande stappen te volgen:

  1. Upgrade uw PostgreSQL JDBC-stuurprogrammaversie van een oudere versie naar 42.2.16 of hoger in pom.xml of helling.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. En natuurlijk moet u PostgreSQL Server-versie>=11 op uw computer hebben geïnstalleerd om een ​​procedure te maken.

  3. Als u Spring gebruikt, moet u tijdens het maken van het Data Source-object escapeSyntaxCallMode toevoegen als een queryreeks in "jdbcUrl" zoals dit:

    <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} :hier heb ik de enum-waarde uit het eigenschappenbestand gekozen, maar je kunt elke enum-waarde rechtstreeks typen onder "func"/"call"/"callIfNoReturn" volgens uw vereiste.

Nu voert u uw code uit en deze zal correct werken.

Opmerking: U hoeft niets te veranderen aan de procedureaanroep, of u nu gewone JDBC-code of @Procedure gebruikt in Spring Data Jpa.

volg voor meer informatie deze link https://github.com/pgjdbc/pgjdbc




  1. Configuratie met hoge beschikbaarheid voor ClusterControl-knooppunten met behulp van CMON HA

  2. Arabische gegevens invoegen in mysql-database

  3. PostgreSQL-query om resultaten te retourneren als een door komma's gescheiden lijst

  4. Postgres - Hoe converteer je een rij met een int-bereik naar tussenliggende rijen van individuele waarden uit dat bereik?