2010-07-05 58 views
6

tôi cần phải gọi một thủ tục lưu trữ sử dụng JPA và tìm thấy bài viết này:Gọi Oracle Stored Procedure Sử dụng createNativeQuery

http://www.oracle.com/technology/pub/articles/vasiliev-jpql.html

điều này giải thích làm thế nào để sử dụng EntityManager.createNativeQuery. Tuy nhiên, ví dụ này thực sự gọi một hàm có đối số trả về. Tôi đã thử tìm kiếm một ví dụ về việc gọi một thủ tục được lưu trữ không có trả lại, nhưng không thể tìm thấy bất cứ thứ gì.

Tôi có thể sử dụng createNativeQuery để gọi thủ tục không? Hay thủ tục cần phải được sửa đổi để trở thành một hàm (có lẽ trả về kết quả thành công/thất bại)?

Cảm ơn!

Trả lời

11

Từ wiki JPA:

1.4 Stored Procedures

JPA không có bất kỳ hỗ trợ trực tiếp cho các thủ tục lưu trữ. Một số loại thủ tục lưu sẵn có thể được thực hiện trong JPA thông qua việc sử dụng các truy vấn gốc. Các truy vấn gốc trong JPA cho phép bất kỳ SQL nào trả về không có gì, hoặc trả về một tập kết quả cơ sở dữ liệu được thực hiện. Cú pháp để thực thi một thủ tục lưu sẵn phụ thuộc vào cơ sở dữ liệu. JPA không hỗ trợ các thủ tục được lưu trữ sử dụng các tham số OUTPUT hoặc INOUT. Một số cơ sở dữ liệu như DB2, Sybase và SQL Server cho phép các thủ tục được lưu trữ trả về các tập kết quả. Oracle không cho phép các kết quả được trả về, chỉ các tham số OUTPUT, nhưng không định nghĩa kiểu CURSOR có thể được trả về như một tham số OUTPUT. Oracle cũng hỗ trợ các hàm được lưu trữ, có thể trả về một giá trị duy nhất. Một hàm được lưu trữ thường có thể được thực hiện bằng cách sử dụng truy vấn SQL nguyên gốc bằng cách chọn giá trị hàm từ bảng Oracle DUAL.

Một số nhà cung cấp JPA đã mở rộng hỗ trợ cho các thủ tục được lưu trữ, một số cũng hỗ trợ ghi đè bất kỳ hoạt động CRUD nào đối với thực thể có thủ tục lưu sẵn hoặc SQL tùy chỉnh. Một số nhà cung cấp JPA có hỗ trợ cho các tham số CURSOR OUTPUT.

Ví dụ thực hiện một thủ tục được lưu trữ trên Oracle

EntityManager em = getEntityManager(); 
Query query = em.createNativeQuery("BEGIN VALIDATE_EMP(P_EMP_ID=>?); END;"); 
query.setParameter(1, empId); 
query.executeUpdate(); 

Vì vậy, lời khuyên của tôi sẽ là:

  • làm một số lần thử nghiệm (ví dụ: thử nó)
  • nếu cần (và nếu có thể) sửa đổi thủ tục được lưu trữ
  • xem xét các tiện ích mở rộng cụ thể của nhà cung cấp (như phương sách cuối cùng)
+0

Cảm ơn Pascal cho liên kết. Tôi không biết làm cách nào tôi bỏ lỡ trang đó trong tìm kiếm của mình. – sdoca

1

Nếu có thể, bạn có thể sẽ cần phải quấn gọi thủ tục theo cách này:

em.createNativeQuery("BEGIN yourprocedure; END;") 

Bắt giá trị trả lại có thể có vấn đề với các thủ tục. Vượt qua chúng sẽ dễ dàng.

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