2013-04-17 5 views
2

Может кто-нибудь объяснить мне, как вызвать хранимую процедуру вызова с помощью EclipseLink? Вот моя хранимая процедура:Как вызвать хранимую процедуру Oracle с использованием EclipseLink (JPA)

TYPE nested_varchar2 IS TABLE OF varchar2(15); 
TYPE nested_number IS TABLE OF number(1); 

procedure set_pacs_state_cond(
    icond in varchar2, -- where condition 
    icheck_state in number, -- check expected current state 
    iso_id_list out nested_varchar2, -- list of suboperators 
    ipac_list out nested_varchar2, -- list of pacs 
    iresult out nested_number -- list of results 
); 

Я использую EclipseLink 2.4.1 в качестве реализации JPA. См. Мой код ниже.

PLSQLStoredProcedureCall call = new PLSQLStoredProcedureCall(); 

call.setProcedureName("PCK_PR.set_pacs_state_cond"); 

call.addNamedArgument("icond", "icond", Types.VARCHAR); 
call.addNamedArgument("icheck_state", "icheck_state", Types.NUMERIC); 
call.addNamedOutputArgument("iso_id_list", "iso_id_list", Types.ARRAY, "nested_varchar2"); 
call.addNamedOutputArgument("ipac_list", "ipac_list", Types.ARRAY, "nested_varchar2"); 
call.addNamedOutputArgument("iresult","iresult", Types.ARRAY, "nested_number"); 

DataModifyQuery valQuery = new DataModifyQuery(); 
valQuery.setCall(call); 

valQuery.addArgument("icond"); 
valQuery.addArgument("icheck_state"); 
valQuery.addArgument("iso_id_list", java.sql.Array.class); 
valQuery.addArgument("ipac_list", java.sql.Array.class); 
valQuery.addArgument("iresult", java.sql.Array.class); 

List test1 = new ArrayList(); 
List test2 = new ArrayList(); 
List test3 = new ArrayList(); 

valQuery.addArgumentValue("WHERE"); 
valQuery.addArgumentValue(1); 
valQuery.addArgumentValue(test1); 
valQuery.addArgumentValue(test2); 
valQuery.addArgumentValue(test3); 

session.executeQuery(valQuery); 

List results = (List) session.executeQuery(valQuery); 

em.getTransaction().commit(); 

DatabaseRecord record = (DatabaseRecord)results.get(0); 

List ii = (List) record.get("iso_id_list"); 
List i = (List) record.get("ipac_list"); 
List r = (List) record.get("iresult"); 

em.close(); 

Я получаю следующее сообщение об ошибке: типы ТАБЛИЦА

Internal Exception: java.sql.SQLException: ORA-06550: line 5, column 21: 
PLS-00201: identifier 'ARRAY' must be declared 
ORA-06550: line 5, column 21: 

ответ

2

PLSQL не могут быть возвращены через JDBC. Способ PLSQLStoredProcedureCall заключается в том, что он переносит типы TABLE типами VARRAY. Вам нужно создать зеркало VARRAY типа yourslef и указать их. Вот пример одного из или тестов,

PLSQLCollection collection = new PLSQLCollection(); 
    collection.setTypeName("PLSQL_P.PLSQL_CITY_LIST"); 
    collection.setCompatibleType("PLSQL_P_PLSQL_CITY_LIST"); 
    collection.setNestedType(JDBCTypes.VARCHAR_TYPE); 

    PLSQLStoredProcedureCall call = new PLSQLStoredProcedureCall(); 
    call.setProcedureName("PLSQL_P.PLSQL_CITY_LIST_IN"); 
    call.addNamedArgument("P_CITY_LIST", collection); 
    call.addNamedArgument("P_CITY", JDBCTypes.VARCHAR_TYPE); 
    DataModifyQuery query = new DataModifyQuery(); 
    query.addArgument("P_CITY_LIST", java.sql.Array.class); 
    query.addArgument("P_CITY", String.class); 
    query.setCall(call); 
+0

Привет, спасибо за быстрый ответ! Я попробую и дам вам знать! Благодаря ! –

+0

Джеймс, не могли бы вы предоставить определение своей хранимой процедуры и типов, пожалуйста? благодаря! –

+0

Но насколько я знаю, когда вы определяете VARRAY, вам нужно указать длину исправления, правильно? Я не знаю длины во время разработки. Могу я как-нибудь справиться с этим? –

Смежные вопросы