PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgresql 11:Lỗi cuộc gọi thủ tục đã lưu trữ - Để gọi một thủ tục, hãy sử dụng CALL, Java

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ị:

  1. "func "- đặt điều này khi chúng ta luôn muốn gọi các hàm.
  2. "call "- đặt điều này khi chúng tôi luôn muốn gọi là Thủ tục.
  3. "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:

  1. 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>
    
  2. 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.

  3. 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để lấy một đối tượng json làm cột trong postgresql?

  2. Ứng dụng Simple Rails:Lỗi Không thể truy cập Số nguyên

  3. Tạo các thủ tục được lưu trữ với SQLAlchemy

  4. Trả lại tất cả hồ sơ lịch sử cho các tài khoản có thay đổi về giá trị liên quan cụ thể

  5. CẬP NHẬT / CHÈN dựa trên nếu một hàng tồn tại