Eclipse Link: выходной параметр - это массив объектов - PullRequest
0 голосов
/ 26 февраля 2020

Я долго искал, но примеры использования 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 совместим, хотя вложенная таблица - нет), или отправленное мной значение неверно.

Кстати, преобразование не необходимо.

...