PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgresql 11 :Erreur d'appel de procédure stockée - Pour appeler une procédure, utilisez CALL, Java

Après PostgreSQL 11, l'équipe de pilotes PostgreSQL JDBC a introduit un nom ENUM EscapeSyntaxCallMode dans la version 42.2.16 du pilote PostgreSQL. Nous pouvons utiliser cette énumération lors de la création d'une connexion à une base de données ou d'un DataSource objet. Cette énumération a 3 types de valeurs :

  1. "func " - définissez ceci lorsque nous voulons toujours appeler des fonctions.
  2. "call " - définissez ceci lorsque nous voulons toujours appeler des procédures.
  3. "callIfNoReturn " - Il vérifie le type de retour lors de l'appel de la fonction/procédure, si le type de retour existe, PostgreSQL le considère comme une fonction et l'appelle comme une fonction. Sinon, il l'appelle comme une procédure. Donc, dans mon projet, j'ai utilisé ceci "callIfNoReturn ", car je voulais que PostgreSQL détecte automatiquement si j'appelle une fonction ou une procédure.

Donc, pour résoudre ce problème, il vous suffit de suivre les étapes ci-dessous :

  1. Mettez à niveau votre version de pilote PostgreSQL JDBC à partir de n'importe quelle version antérieure vers 42.2.16 ou une version supérieure dans pom.xml ou graduel.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. Et bien sûr, vous devez avoir la version PostgreSQL Server>=11 installée sur votre machine pour créer une procédure.

  3. Si vous utilisez Spring, lors de la création de l'objet Data Source, vous devez ajouter escapeSyntaxCallMode sous forme de chaîne de requête dans "jdbcUrl" comme ceci :

    <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} :ici, j'ai choisi la valeur enum du fichier de propriétés, mais vous pouvez taper directement n'importe quelle valeur enum parmi "func"/"call"/"callIfNoReturn" selon vos besoins.

Maintenant, vous exécutez votre code et il fonctionnera correctement.

Remarque : Vous n'avez pas besoin de changer quoi que ce soit dans le mode d'appel de procédure, que vous utilisiez du code JDBC brut ou @Procedure dans Spring Data Jpa.

pour plus de détails, veuillez suivre ce lien https://github.com/pgjdbc/pgjdbc