sql >> データベース >  >> RDS >> PostgreSQL

Postgresql 11:ストアドプロシージャ呼び出しエラー-プロシージャを呼び出すには、CALL、Javaを使用します

    PostgreSQL 11の後、PostgreSQLJDBCドライバーチームはENUM名を導入しました EscapeSyntaxCallMode PostgreSQLドライバーバージョン42.2.16。この列挙型は、データベース接続またはDataSourceの作成時に使用できます。 物体。この列挙型には、次の3種類の値があります。

    1. "func "-常に関数を呼び出したいときにこれを設定します。
    2. "call "-常にプロシージャを呼び出したいときにこれを設定します。
    3. "callIfNoReturn "-関数/プロシージャを呼び出すときにリターンタイプをチェックします。リターンタイプが存在する場合、PostgreSQLはそれを関数と見なし、関数ウェイとして呼び出します。それ以外の場合は、プロシージャウェイとして呼び出します。したがって、私のプロジェクトではこれを使用しました" callIfNoReturn "、関数を呼び出しているのかプロシージャを呼び出しているのかをPostgreSQLに自動検出させたかったので。

    したがって、この問題を修正するには、以下の手順に従うだけで済みます。

    1. pom.xmlで、PostgreSQLJDBCドライバーのバージョンを古いバージョンから42.2.16以降にアップグレードします。 またはgradle。

      <dependency>
          <groupId>org.postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <version>42.2.16</version>
      </dependency>
      
    2. もちろん、プロシージャを作成するには、マシンにPostgreSQLServerバージョン>=11がインストールされている必要があります。

    3. Springを使用している場合は、データソースオブジェクトの作成中に、escapeSyntaxCallModeを追加する必要があります。 "jdbcUrl"のクエリ文字列として このように:

      <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} :ここでは、プロパティファイルから列挙値を選択しましたが、"func"/"call"/"callIfNoReturn"の中から任意の列挙値を直接入力できます。 要件に応じて。

    これでコードを実行すると、正しく機能します。

    注: Spring Data JpaでプレーンJDBCコードを使用している場合でも、@ Procedureを使用している場合でも、プロシージャ呼び出しの方法を変更する必要はありません。

    詳細については、このリンクをたどってください https://github.com/pgjdbc/pgjdbc




    1. FROM(UNIX_TIME)の場合のSQLの場合

    2. SQLServer-ストアドプロシージャが終了するまでテーブルをロックする方法

    3. Postgresql Windows、デフォルトのパスワードはありますか?

    4. PDO ::lastInsertIdが0を返すのはなぜですか?