Sau PostgreSQL 11, nhóm trình điều khiển PostgreSQL JDBC đã giới thiệu tên ENUM EscapeSyntaxCallMode trong phiên bản trình điều khiển PostgreSQL 42.2.16. Chúng ta có thể sử dụng enum này trong khi tạo kết nối cơ sở dữ liệu hoặc DataSource
sự vật. Enum này có 3 loại giá trị:
- "
func
"- đặt điều này khi chúng ta luôn muốn gọi các hàm. - "
call
"- đặt điều này khi chúng tôi luôn muốn gọi là Thủ tục. - "
callIfNoReturn
"- Nó kiểm tra kiểu trả về khi gọi hàm / thủ tục, nếu kiểu trả về tồn tại thì PostgreSQL coi nó như một hàm và gọi nó như một cách hàm. Nếu không, nó gọi nó là cách thủ tục. Vì vậy, trong dự án của tôi, tôi đã sử dụng điều này"callIfNoReturn
", vì tôi muốn PostgreSQL tự động phát hiện xem tôi có đang gọi hàm hay thủ tục hay không.
Vì vậy, để khắc phục sự cố này, bạn chỉ cần làm theo các bước sau:
-
Nâng cấp phiên bản trình điều khiển PostgreSQL JDBC của bạn từ bất kỳ phiên bản nào cũ hơn lên 42.2.16 hoặc cao hơn trong
pom.xml
hoặc gradle.<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency>
-
Và tất nhiên, bạn phải cài đặt phiên bản Máy chủ PostgreSQL> =11 trong máy của mình để tạo quy trình.
-
Nếu bạn đang sử dụng Spring, thì trong khi tạo đối tượng Nguồn dữ liệu, bạn cần thêm
escapeSyntaxCallMode
dưới dạng một chuỗi truy vấn trong"jdbcUrl"
như thế này:<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}
:ở đây tôi đã chọn giá trị enum từ tệp thuộc tính, nhưng bạn có thể nhập trực tiếp bất kỳ giá trị enum nào trong số"func"/"call"/"callIfNoReturn"
theo yêu cầu của bạn.
Bây giờ bạn chạy mã của mình và nó sẽ hoạt động bình thường.
Lưu ý: Bạn không cần thay đổi bất kỳ điều gì trong cách gọi thủ tục cho dù bạn đang sử dụng mã JDBC thuần túy hay @Procedure trong Spring Data Jpa.
để biết thêm chi tiết, vui lòng truy cập liên kết này https://github.com/pgjdbc/pgjdbc