13

PostgreSQL documentation đề xuất sử dụng một số CallableStatement để gọi thủ tục được lưu trữ.các thủ tục được lưu trữ dưới dạng truy vấn: CallableStatement so với PreparedStatement

String callString = "{ call rankFoos(?, ?) }"; 
CallableStatement callableStatement = con.prepareCall(callString); 
callableStatement.setString(1, fooCategory); 
callableStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

Và việc sử dụng thường xuyên PreparedStatement::

String queryString = "SELECT FooUID, Rank FROM rankFoos(?, ?);"; 
PreparedStatement preparedStatement = connection.prepareStatement(queryString); 
preparedStatement.setString(1, fooCategory); 
preparedStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

Theo tôi được biết, CallableStatement Mời

Trong trường hợp của một thủ tục lưu trữ mà trả về một rowset, sự khác biệt giữa việc sử dụng CallableStatement là gì một cách bất khả tri về ngôn ngữ gọi thủ tục được lưu trữ. Điều này không quan trọng với tôi, vì tôi biết tôi đang sử dụng PostgreSQL. Theo như tôi thấy, lợi thế rõ ràng của việc sử dụng các PreparedStatement là một truy vấn linh hoạt hơn, xử lý các thủ tục lưu trữ như một bảng, trên đó tôi có thể sử dụng WHERE, JOIN, ORDER BY vv

Có khía cạnh hoặc khác biệt giữa các phương pháp mà tôi đang thiếu? Trong trường hợp của một thủ tục được lưu trữ được sử dụng như một truy vấn, được khuyến nghị?

Trả lời

12

Tôi khá chắc chắn cách tiếp cận thứ hai không hoạt động chút nào với một số RDBMS, nhưng vì bạn sẽ chỉ sử dụng PostgreSQL, điều đó không quan trọng quá nhiều. Đối với trường hợp đơn giản của bạn, thực sự không có nhiều nhược điểm. Có hai vấn đề tôi có thể thấy popping up:

  1. Tùy thuộc vào cách thủ tục lưu trữ được viết, họ có thể yêu cầu bạn đăng ký tham số để thực hiện thủ tục. Điều đó sẽ không thể có được ở tất cả với các phát biểu chuẩn bị. Nếu bạn kiểm soát cả việc tạo thủ tục lưu sẵn và mã gọi, bạn có thể không phải lo lắng về điều này.

  2. Nó giới hạn hiệu quả của việc gọi các thủ tục được lưu trữ ngay từ đầu. Một trong những ưu điểm chính của một thủ tục lưu sẵn là gói gọn logic truy vấn ở cấp cơ sở dữ liệu. Điều này cho phép bạn điều chỉnh truy vấn hoặc trong một số trường hợp thêm chức năng mà không phải thực hiện thay đổi đối với mã của bạn. Nếu bạn đang lập kế hoạch bổ sung thêm các mệnh đề tham gia vào kết quả của lời gọi thủ tục đã lưu trữ, tại sao không chỉ đặt truy vấn ban đầu trong lớp java của bạn?

7

Sự khác biệt chính là cách lập trình độc lập và đóng gói.

Hãy tưởng tượng bạn là người lập trình Java và bạn không biết cách sử dụng cơ sở dữ liệu, bằng cách này bạn không thể sử dụng phương pháp thứ hai và u sẽ gặp vấn đề theo cách thứ hai.

Phương pháp đầu tiên cho phép bạn thực hiện mã java của mình và yêu cầu ai đó viết các gợi ý cho bạn như Quy trình lưu trữ, vì vậy bạn có thể sử dụng chúng dễ dàng.

Tôi đồng ý với @dlawrence

+0

Thông tin chi tiết tốt. Cảm ơn! –

Các vấn đề liên quan