PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgresql 11:Aufruffehler bei gespeicherter Prozedur – Um eine Prozedur aufzurufen, verwenden Sie CALL, Java

Nach PostgreSQL 11 hat das PostgreSQL JDBC-Treiberteam einen ENUM-Namen EscapeSyntaxCallMode eingeführt in der PostgreSQL-Treiberversion 42.2.16. Wir können diese Aufzählung beim Erstellen einer Datenbankverbindung oder einer DataSource verwenden Objekt. Diese Aufzählung hat 3 Arten von Werten:

  1. "func " - setzen Sie dies, wenn wir immer Funktionen aufrufen möchten.
  2. "call " - setzen Sie dies, wenn wir immer Prozeduren aufrufen möchten.
  3. "callIfNoReturn " - Es prüft den Rückgabetyp beim Aufrufen von Funktionen/Prozeduren, wenn ein Rückgabetyp vorhanden ist, betrachtet PostgreSQL ihn als Funktion und ruft ihn als Funktion auf. Andernfalls ruft er ihn als Prozedur auf. Also habe ich in meinem Projekt diesen "callIfNoReturn ", da ich wollte, dass PostgreSQL automatisch erkennt, ob ich eine Funktion oder eine Prozedur aufrufe.

Um dieses Problem zu beheben, müssen Sie also nur die folgenden Schritte ausführen:

  1. Aktualisieren Sie Ihre PostgreSQL-JDBC-Treiberversion von einer älteren Version auf 42.2.16 oder höher in pom.xml oder gradle.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. Und natürlich muss PostgreSQL Server Version>=11 auf Ihrem Computer installiert sein, um eine Prozedur zu erstellen.

  3. Wenn Sie Spring verwenden, müssen Sie beim Erstellen des Datenquellenobjekts escapeSyntaxCallMode anhängen als Abfragestring in "jdbcUrl" so:

    <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 habe ich einen Aufzählungswert aus der Eigenschaftsdatei ausgewählt, aber Sie können jeden Aufzählungswert direkt unter "func"/"call"/"callIfNoReturn" eingeben entsprechend Ihrer Anforderung.

Jetzt führen Sie Ihren Code aus und er wird ordnungsgemäß funktionieren.

Hinweis: Sie müssen nichts am Prozeduraufruf ändern, egal ob Sie einfachen JDBC-Code oder @Procedure in Spring Data Jpa verwenden.

Für weitere Details folgen Sie bitte diesem Link https://github.com/pgjdbc/pgjdbc