sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql 11:Anropsfel för lagrad procedur - För att anropa en procedur, använd CALL, Java

Efter PostgreSQL 11 har PostgreSQL JDBC-förarteamet introducerat ett ENUM-namn EscapeSyntaxCallMode i PostgreSQL-drivrutin version 42.2.16. Vi kan använda denna uppräkning när vi skapar en databasanslutning eller en DataSource objekt. Denna uppräkning har 3 typer av värden:

  1. "func " - ställ in detta när vi alltid vill anropa funktioner.
  2. "call " - ställ in detta när vi alltid vill anropa Procedurer.
  3. "callIfNoReturn " - Den letar efter returtypen i anropande funktion/procedur, om returtyp existerar betraktar PostgreSQL den som en funktion och anropar den som en funktionsväg. Annars anropar den den som proceduresätt. Så i mitt projekt använde jag denna "callIfNoReturn ", eftersom jag ville att PostgreSQL automatiskt skulle upptäcka om jag anropar funktion eller procedur.

Så för att åtgärda det här problemet behöver du bara följa dessa steg nedan:

  1. Uppgradera din PostgreSQL JDBC-drivrutinsversion från valfri äldre version till 42.2.16 eller senare i pom.xml eller gradera.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. Och naturligtvis måste du ha PostgreSQL Server version>=11 installerad i din maskin för att skapa en procedur.

  3. Om du använder Spring måste du lägga till escapeSyntaxCallMode när du skapar Data Source-objekt. som en frågesträng i "jdbcUrl" så här:

    <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} :här valde jag enum-värde från egenskapsfilen, men du kan direkt skriva in valfritt enum-värde bland "func"/"call"/"callIfNoReturn" enligt dina krav.

Nu kör du din kod och den kommer att fungera korrekt.

Obs! Du behöver inte ändra något i vägen för proceduranrop oavsett om du använder vanlig JDBC-kod eller @Procedure i Spring Data Jpa.

för mer information följ denna länk https://github.com/pgjdbc/pgjdbc




  1. Räkna referenser till en post i en tabell via främmande nycklar

  2. mysql falska val

  3. Hur man installerar flera PostgreSQL-servrar på RedHat Linux

  4. Använder $_SESSION för att överföra data