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:
- "
func
" - atur ini ketika kita selalu ingin memanggil fungsi. - "
call
" - atur ini ketika kita selalu ingin memanggil Prosedur. - "
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:
-
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>
-
Dan tentu saja, Anda harus menginstal PostgreSQL Server versi>=11 di mesin Anda untuk membuat prosedur.
-
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