PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgresql 11:Erro de chamada de procedimento armazenado - Para chamar um procedimento, use CALL, Java


Após o PostgreSQL 11, a equipe de drivers PostgreSQL JDBC introduziu um nome ENUM EscapeSyntaxCallMode no driver PostgreSQL versão 42.2.16. Podemos usar este enum ao criar uma conexão de banco de dados ou um DataSource objeto. Este enum tem 3 tipos de valores:
  1. "func " - defina isso quando sempre queremos chamar funções.
  2. "call " - defina isso quando sempre queremos chamar Procedures.
  3. "callIfNoReturn " - Ele verifica o tipo de retorno ao chamar a função/procedimento, se o tipo de retorno existe o PostgreSQL o considera como uma função e o chama como uma maneira de função. Caso contrário, ele a chama como uma maneira de procedimento. Então no meu projeto usei este "callIfNoReturn ", pois queria que o PostgreSQL detectasse automaticamente se estou chamando uma função ou procedimento.

Portanto, para corrigir esse problema, você só precisa seguir estas etapas abaixo:

  1. Atualize sua versão do driver PostgreSQL JDBC de qualquer versão mais antiga para 42.2.16 ou superior em pom.xml ou grade.
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    

  2. E claro, você deve ter o PostgreSQL Server versão>=11 instalado em sua máquina para criar um procedimento.

  3. Se você estiver usando Spring, ao criar o objeto Data Source, você precisará anexar escapeSyntaxCallMode como uma string de consulta em "jdbcUrl" assim:
    <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} :aqui eu escolhi o valor enum do arquivo de propriedades, mas você pode digitar diretamente qualquer valor enum entre "func"/"call"/"callIfNoReturn" de acordo com sua exigência.

Agora você executa seu código e ele funcionará corretamente.

Observação: Você não precisa alterar nada na forma de chamada de procedimento se estiver usando código JDBC simples ou @Procedure no Spring Data Jpa.

para mais detalhes, siga este link https://github.com/pgjdbc/pgjdbc