sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgresql 11:error de llamada de procedimiento almacenado:para llamar a un procedimiento, use CALL, Java

Después de PostgreSQL 11, el equipo de controladores JDBC de PostgreSQL introdujo un nombre ENUM EscapeSyntaxCallMode en el controlador PostgreSQL versión 42.2.16. Podemos usar esta enumeración al crear una conexión de base de datos o un DataSource objeto. Esta enumeración tiene 3 tipos de valores:

  1. "func " - configure esto cuando siempre queramos llamar funciones.
  2. "call ":establezca esto cuando siempre queramos llamar a Procedimientos.
  3. "callIfNoReturn "- Verifica el tipo de devolución en la función/procedimiento de llamada, si existe el tipo de devolución, PostgreSQL lo considera como una función y lo llama como una forma de función. De lo contrario, lo llama como una forma de procedimiento. Así que en mi proyecto usé este "callIfNoReturn ", ya que quería que PostgreSQL detectara automáticamente si estoy llamando a una función o a un procedimiento.

Entonces, para solucionar este problema, solo necesita seguir estos pasos a continuación:

  1. Actualice su versión del controlador JDBC de PostgreSQL desde cualquier versión anterior a 42.2.16 o superior en pom.xml o gradle.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. Y, por supuesto, debe tener la versión del servidor PostgreSQL>=11 instalada en su máquina para crear un procedimiento.

  3. Si está utilizando Spring, al crear el objeto Fuente de datos, debe agregar escapeSyntaxCallMode como cadena de consulta en "jdbcUrl" así:

    <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} :aquí elegí el valor de enumeración del archivo de propiedades, pero puede escribir directamente cualquier valor de enumeración entre "func"/"call"/"callIfNoReturn" de acuerdo a su requerimiento.

Ahora ejecute su código y funcionará correctamente.

Nota: No necesita cambiar nada en la forma de llamar al procedimiento, ya sea que esté utilizando código JDBC simple o @Procedure en Spring Data Jpa.

para obtener más detalles, siga este enlace https://github.com/pgjdbc/pgjdbc