PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgresql 11:errore di chiamata stored procedure - Per chiamare una procedura, utilizzare CALL, Java

Dopo PostgreSQL 11, il team di driver JDBC di PostgreSQL ha introdotto un nome ENUM EscapeSyntaxCallMode nella versione del driver PostgreSQL 42.2.16. Possiamo usare questo enum durante la creazione di una connessione al database o un DataSource oggetto. Questa enumerazione ha 3 tipi di valori:

  1. "func " - impostalo quando vogliamo sempre chiamare le funzioni.
  2. "call " - impostalo quando vogliamo sempre chiamare Procedure.
  3. "callIfNoReturn " - Verifica il tipo restituito nella funzione/procedura chiamante, se il tipo restituito esiste PostgreSQL lo considera come una funzione e lo chiama come modo funzione. Altrimenti lo chiama come modo procedura. Quindi nel mio progetto ho usato questo "callIfNoReturn ", poiché volevo che PostgreSQL rilevasse automaticamente se sto chiamando una funzione o una procedura.

Quindi, per risolvere questo problema, devi solo seguire questi passaggi seguenti:

  1. Aggiorna la versione del tuo driver PostgreSQL JDBC da qualsiasi versione precedente a 42.2.16 o successiva in pom.xml o gradle.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. E, naturalmente, devi avere la versione di PostgreSQL Server>=11 installata nel tuo computer per creare una procedura.

  3. Se stai usando Spring, durante la creazione dell'oggetto Data Source, devi aggiungere escapeSyntaxCallMode come stringa di query in "jdbcUrl" così:

    <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} :qui ho selezionato il valore enum dal file di proprietà, ma puoi digitare direttamente qualsiasi valore enum tra "func"/"call"/"callIfNoReturn" secondo il vostro requisito.

Ora esegui il tuo codice e funzionerà correttamente.

Nota: Non è necessario modificare nulla nel modo di chiamare la procedura se si utilizza codice JDBC semplice o @Procedure in Spring Data Jpa.

per maggiori dettagli, segui questo link https://github.com/pgjdbc/pgjdbc