2014-10-01 23 views
5

Ben benzeyen bir saklı yordam var:Java dan saklı yordam% Rowtype erişme

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); 

bu gibi bir JAVA programından bu prosedürü arıyorum:

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); 

Fakat ilk iki parametreyi nasıl ayarlayacağımı bilmiyorum. Yardım edin.Teşekkürler

+0

Bu değişkenlere ne koymak istersiniz, nereden geliyorlar ve Java tarafında ne tür bir nesne var? –

+0

Bunu JDBC'den arayacağınızdan şüpheliyim. RowType PL/SQL özgüdür. Muhtemelen paketin içinde bir yerde tanımlanmıştı. Bu sınıfı sizin adınıza uygun parametrelerle çağırmış olan PL/SQL'de bir yardım prosedürü oluşturmanız/çağırmanız gerekecektir. – Mike

cevap

4

Mike'ın dediği gibi, bir JDBC çağrısında bir satır türüne doğrudan başvuru yapamazsınız, çünkü satır türleri yalnızca PL/SQL içinde geçerlidir ve sürücü tarafından kullanılan tüm türlerin SQL düzeyinde tanımlanması gerekir.

Tablo yapınızı gölgeleyen (tablonun değiştirilip değiştirilmediğini hatırlamanız gereken) kendi SQL nesne türünüzü ve bu türü alan bir sarıcı yordamını tanımlayabilir ve onu bir aramaya dönüştürebilirsiniz. gerçek prosedür.

// 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 

Eğer: Eğer doldurmak ve bir STRUCT olarak bu gönderebilir Java tarafında Sonra

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; 
/

: Bu keşke gerçek tablo yapısını bilmiyorum çünkü çift dayanan bir demo gerçek paketinizi değiştiremezsiniz, daha sonra sarıcı için yeni bir tane veya basit bir prosedür oluşturabilirsiniz; Bu Java kodu daha karmaşık hale getirir olsa veya hatta, anonim bir blokta dönüşüm yapabileceği:

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;" 
); 

... hala aynı yapı bağlayıcı SQL tipi hala gereklidir böylece. Sadece ifade değişir, ancak şimdi bir sarıcı olmadan orijinal prosedürü arayabilir.

İlgili konular