PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgresql 11:Kesalahan panggilan Prosedur Tersimpan - Untuk memanggil prosedur, gunakan CALL, Java

Setelah PostgreSQL 11, tim driver PostgreSQL JDBC telah memperkenalkan nama ENUM EscapeSyntaxCallMode di driver PostgreSQL versi 42.2.16. Kita dapat menggunakan enum ini saat membuat koneksi database atau DataSource obyek. Enum ini memiliki 3 jenis nilai:

  1. "func " - atur ini ketika kita selalu ingin memanggil fungsi.
  2. "call " - atur ini ketika kita selalu ingin memanggil Prosedur.
  3. "callIfNoReturn " - Ia memeriksa jenis pengembalian dalam fungsi/prosedur panggilan, jika jenis pengembalian ada, PostgreSQL menganggapnya sebagai fungsi dan menyebutnya sebagai cara fungsi. Jika tidak, ia menyebutnya sebagai cara prosedur. Jadi dalam proyek saya, saya menggunakan ini "callIfNoReturn ", karena saya ingin PostgreSQL mendeteksi secara otomatis apakah saya memanggil fungsi atau prosedur.

Jadi, untuk memperbaiki masalah ini, Anda hanya perlu mengikuti langkah-langkah di bawah ini:

  1. Tingkatkan versi driver PostgreSQL JDBC Anda dari versi yang lebih lama ke 42.2.16 atau lebih tinggi di pom.xml atau gradle.

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.16</version>
    </dependency>
    
  2. Dan tentu saja, Anda harus menginstal PostgreSQL Server versi>=11 di mesin Anda untuk membuat prosedur.

  3. Jika Anda menggunakan Spring, maka saat membuat objek Sumber Data, Anda perlu menambahkan escapeSyntaxCallMode sebagai string kueri di "jdbcUrl" seperti ini:

    <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} :di sini saya mengambil nilai enum dari file properti, tetapi Anda dapat langsung mengetikkan nilai enum apa pun di antara "func"/"call"/"callIfNoReturn" sesuai dengan kebutuhan Anda.

Sekarang Anda menjalankan kode Anda, dan itu akan berfungsi dengan baik.

Catatan: Anda tidak perlu mengubah apa pun dalam panggilan prosedur apakah Anda menggunakan kode JDBC biasa atau @Procedure di Spring Data Jpa.

untuk detail lebih lanjut, silakan ikuti tautan ini https://github.com/pgjdbc/pgjdbc




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PSQLException:ERROR:relasi TABLE_NAME tidak ada

  2. Pengecualian Geodjango saat mengimpor Django.contrib.gis.gdal:OSError:/usr/lib/libgdal.so.1:simbol tidak terdefinisi:sqlite3_column_table_name

  3. Contoh pernyataan INSERT yang disiapkan menggunakan permata ruby ​​pg

  4. Tidak ada permintaan kata sandi untuk pengguna super postgresql

  5. Haruskah hibernasi menggunakan urutan unik untuk setiap tabel?