2014-10-01 13 views
5

Tôi có một thủ tục lưu trữ mà trông giống như:Tiếp cận% ROWTYPE của Stored Procedure từ Java

PROCEDURE get_curx( p_buf  IN ni_imsi%ROWTYPE, 
         p_bufx IN ni_imsi%ROWTYPE, 
         p_cur  OUT CurTyp, 
         p_where IN VARCHAR2 DEFAULT '', 
         p_orderby IN VARCHAR2 DEFAULT '', 
         p_max  IN NUMBER DEFAULT 0, 
         p_lock IN NUMBER DEFAULT 0, 
         p_hint IN VARCHAR2 DEFAULT 'NONE', 
         p_debug IN NUMBER DEFAULT 0, 
         p_count IN BOOLEAN DEFAULT FALSE); 

tôi kêu gọi thủ tục này từ một chương trình JAVA như này:

CallableStatement cs = connection.prepareCall("{call ni_imsi_pkg.get_curx(?,?,?,?,?,?)}"); 

      cs.setObject(1, ?); // i have no clue what to mention here 
      cs.setObject(2, ?); //i have no clue what to mention here 

      cs.registerOutParameter(3, OracleTypes.CURSOR); 
      cs.setString(4, " WHERE current_state = 60000 AND rownum <= 2 "); 
      cs.setString(5, " ORDER BY imsi_number"); 
      cs.setInt(6, 5); 

Nhưng tôi không có ý tưởng làm thế nào để thiết lập hai thông số đầu tiên.Xin vui lòng giúp tôi.Thanks

+0

Bạn muốn đặt gì vào các biến đó, hoặc đúng hơn là chúng đến từ đâu và loại đối tượng nào ở phía Java? –

+0

Tôi nghi ngờ bạn có thể gọi nó từ JDBC. RowType là PL/SQL cụ thể. Nó có thể được định nghĩa trong gói ở đâu đó. Có lẽ bạn sẽ cần phải tạo/gọi một thủ tục trợ giúp trong PL/SQL gọi là lớp này cho bạn với các tham số thích hợp. – Mike

Trả lời

4

Như Mike đã nói, bạn không thể trực tiếp tham chiếu một kiểu hàng trong một cuộc gọi JDBC, vì các kiểu hàng chỉ hợp lệ trong PL/SQL và tất cả các kiểu được trình điều khiển sử dụng phải được định nghĩa ở cấp SQL.

Bạn có thể xác định loại đối tượng SQL của riêng bạn làm bóng cấu trúc bảng của bạn (mà bạn sẽ phải nhớ cập nhật nếu bảng bị thay đổi) và quy trình bao bọc loại đó và chuyển đổi nó thành cuộc gọi đến thủ tục thực sự. Đây là một bản demo dựa trên kép, vì tôi không biết cấu trúc bảng thực sự của bạn:

create type ni_imsi_rowtype as object (dummy varchar2(1)) -- use your real table's columns/types 
/

create package ni_imsi_pkg as 
    procedure get_curx(p_buf dual%rowtype, p_cur out sys_refcursor); 
    procedure get_curx_wrapper(p_buf ni_imsi_rowtype, p_cur out sys_refcursor); 
end ni_imsi_pkg; 
/

create package body ni_imsi_pkg as 
    -- original procedure, simplified for demo 
    procedure get_curx(p_buf dual%rowtype, p_cur out sys_refcursor) is 
    begin 
    open p_cur for select * from dual where dummy = p_buf.dummy; 
    end; 

    -- wrapper procedure taking new type instead of rowtype 
    procedure get_curx_wrapper(p_buf ni_imsi_rowtype, p_cur out sys_refcursor) is 
    l_buf dual%rowtype; 
    begin 
    l_buf.dummy := p_buf.dummy; 
    get_curx(l_buf, p_cur); 
    end; 
end ni_imsi_pkg; 
/

Sau đó, ở phía bên Java bạn có thể cư trú và gửi thông điệp này như một cấu trúc:

// Object array containing the values corresponding to your row type 
Object[] rowObj = { "X" }; 
// Struct based on the SQL type you created 
StructDescriptor structDesc = StructDescriptor.createDescriptor("NI_IMSI_ROWTYPE", conn); 
STRUCT rowStruct = new STRUCT(structDesc, conn, rowObj); 

// Call wrapper function instead of real one 
cs = conn.prepareCall("{ call ni_imsi_pkg.get_curx_wrapper(?,?) }"); 
// Pass the struct defined earlier 
cs.setObject(1, rowStruct); 
cs.registerOutParameter(2, OracleTypes.CURSOR); 
// and other arguments for your real calll 

Nếu bạn không thể sửa đổi gói thực của bạn sau đó bạn có thể tạo một gói mới cho trình bao bọc hoặc một quy trình đơn giản; hoặc thậm chí bạn có thể thực hiện chuyển đổi trong một khối ẩn danh, mặc dù điều đó làm cho mã Java phức tạp hơn:

cs = (OracleCallableStatement) conn.prepareCall(
    "declare l_typ ni_imsi_rowtype; l_buf dual%rowtype; " 
     + "begin l_typ := ?; l_buf.dummy := l_typ.dummy; ni_imsi_pkg.get_curx(l_buf, ?); " 
     + "end;" 
); 

... vẫn còn ràng buộc cùng cấu trúc sao cho kiểu SQL vẫn được yêu cầu. Chỉ có câu lệnh thay đổi, nhưng bây giờ nó có thể gọi thủ tục gốc mà không có trình bao bọc.

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