2014-10-01 17 views
5

Mam procedurę przechowywaną, która wygląda jak:Dostęp% ROWTYPE z procedura składowana z 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); 

wzywam tę procedurę z programu JAVA jak ten:

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

Ale nie mam pojęcia, jak ustawić pierwsze dwa parametry. Proszę mi pomóc. Dzięki

+0

Co chcesz umieścić w tych zmiennych, a raczej skąd one pochodzą i jaki typ obiektu znajdują się po stronie Java? –

+0

Wątpię, czy możesz to nazwać od JDBC. RowType jest specyficzne dla PL/SQL. To było prawdopodobnie zdefiniowane gdzieś w paczce. Prawdopodobnie będziesz musiał utworzyć/wywołać procedurę pomocniczą w PL/SQL, która wywołała dla ciebie tę klasę z odpowiednimi parametrami. – Mike

Odpowiedz

4

Jak powiedział Mike, nie można bezpośrednio odwoływać się do typu wiersza w wywołaniu JDBC, ponieważ typy wierszy są poprawne tylko w języku PL/SQL, a wszystkie typy używane przez sterownik muszą być zdefiniowane na poziomie SQL.

Można zdefiniować własny typ obiektu SQL, który cienie strukturę tabeli (które trzeba będzie pamiętać, aby zaktualizować, jeśli tabela została zmieniona), i procedura otoki, która ma tego typu i przekształca go w połączenie do Twojego prawdziwa procedura. To jest demo na podstawie podwójny, ponieważ nie wiem, swoją prawdziwą strukturę tabeli:

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

Następnie na stronie Java można zainstalować i wyślij jako struct:

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

Jeśli nie można zmodyfikować prawdziwej paczki, możesz utworzyć nową dla opakowania lub prostą procedurę; lub można nawet zrobić konwersję w anonimowym bloku, choć sprawia, że ​​kod Java bardziej skomplikowana:

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

... nadal wiążące ten sam struct tak jest nadal wymagany typ SQL. Tylko instrukcja zmienia się, ale może teraz wywołać oryginalną procedurę bez opakowania.

Powiązane problemy