Я долго искал, но примеры использования Eclipse Link с хранимыми процедурами всегда одинаковы и довольно просты. Может кто-нибудь дать мне пример рабочего кода, когда выходным параметром является массив объектов.
Вот пример:
IN PL SQL:
CREATE OR REPLACE TYPE TYPE_MYOBJECT AS OBJECT (
property1 VARCHAR2(11),
property2 VARCHAR2(11),
....
property59 NUMBER
)
CREATE OR REPLACE TYPE TYPE_ARRAY_STRINGS IS VARRAY(1000000) OF VARCHAR2(200);
CREATE OR REPLACE TYPE TYPE_ARRAY_MYOBJECTS IS VARRAY(1000000) OF TYPE_MYOBJECT;
PROCEDURE myProcedure (param1 IN ARRAY_STRINGS, param2 IN NUMBER, arrayMyObjects OUT TYPE_ARRAY_MYOBJECTS);
Java side:
У меня есть объект Object MyObject, который имеет те же свойства, что и объект PL SQL MyObject.
Итак, используя Eclipse Link, как я могу вызвать процедуру и получить взамен список объектов MyObjects?
Спасибо
Вот что я сделал до сих пор. Я хотел go шаг за шагом, чтобы в процедуре было два аргумента IN типа TYPE_ARRAY_STRINGS и NUMBER.
Примечание. Я попытался использовать только один параметр (NUMBER), и код работает. При добавлении типа TYPE_ARRAY_STRINGS возникает исключение.
PLSQLCollection collectionChaines = new PLSQLCollection();
collectionChaines.setTypeName("TYPE_TABLEAU_CHAINES");
collectionChaines.setCompatibleType("TYPE_TABLEAU_CHAINES");
collectionChaines.setNestedType(JDBCTypes.VARCHAR_TYPE);
collectionChaines.setJavaType(List.class);
PLSQLStoredProcedureCall call = new PLSQLStoredProcedureCall();
call.setProcedureName("GSC_ADM.PK_GAIA.findFilteredSignalements");
call.addNamedArgument("param1",collectionChaines);
call.addNamedArgument("param2", "param2", Types.NUMERIC);
DataReadQuery query = new DataReadQuery();
query.setCall(call);
query.addArgument("numfics", List.class);
query.addArgument("numoffre", Long.class);
List queryArgs = new ArrayList();
queryArgs.add(param1); //param1 is a List, size = 1, value of the String 10000000189
queryArgs.add(param2); //param2 is a Long value 107253
s.executeQuery(query, queryArgs)
Вот журнал, показывающий ошибку:
ORA-06531: Reference to uninitialized collection
DECLARE
numficsTARGET GSC_ADM.TYPE_TABLEAU_CHAINES;
numficsCOMPAT GSC_ADM.TYPE_TABLEAU_CHAINES := :1;
numoffreTARGET NUMERIC := :2;
FUNCTION EL_SQL2PL_1(aSqlItem GSC_ADM.TYPE_TABLEAU_CHAINES)
RETURN GSC_ADM.TYPE_TABLEAU_CHAINES IS
aPlsqlItem GSC_ADM.TYPE_TABLEAU_CHAINES;
BEGIN
IF aSqlItem.COUNT > 0 THEN
FOR I IN 1..aSqlItem.COUNT LOOP
aPlsqlItem(I) := aSqlItem(I);
END LOOP;
END IF;
RETURN aPlsqlItem;
END EL_SQL2PL_1;
BEGIN
numficsTARGET := EL_SQL2PL_1(numficsCOMPAT);
myProcedure(numfics=>numficsTARGET, numoffre=>numoffreTARGET);
END;
bind => [:1 => [10000000189], :2 => 1072539]
Действительно, коллекция не инициализирована, но я не тот написание этой функции EL_SQL2PL_1. Это ошибка? или, более вероятно, я делаю что-то не так, может быть, setCompatibleType неправильный (хотя обычно varray совместим, хотя вложенная таблица - нет), или отправленное мной значение неверно.
Кстати, преобразование не необходимо.