Как передать List как объект при вызове хранимой процедуры - PullRequest
0 голосов
/ 05 октября 2019

Я попробовал приведенный ниже код, но получаю «Недопустимая ошибка типа данных».

Ниже приведен фрагмент кода, через который я вызвал хранимую процедуру и передав строку и список в качестве аргумента.

StoredProcedure sp = session.createStoredProcedure("DIGX_HOST_BRANCH_ACCOUNT_SYNC.HOST_BRANCH_ACCOUNT_SYNC"); 

sp.registerParameter("target_unit", String.class, PARAMETER_MODE.IN);
sp.registerParameter("hostaccounts", List.class, PARAMETER_MODE.IN);
sp.setParameter("target_unit", entity);
sp.setParameter("hostaccounts", branchAccounts.getHostBrachAccounts());

sp.execute();
session.close();

Сначала я создал тип и упомянул соответствующие атрибуты

create or replace type HostBranchAccount as object (
    partyId varchar2(50),
    accountNumber varchar2(50),
    oldBranchID varchar2(50),
    newBranchID varchar2(50)
);

create or replace type HostBranchAccountListResponse as table of HostBranchAccount;




create or replace PACKAGE DIGX_HOST_BRANCH_ACCOUNT_SYNC AS
END DIGX_HOST_BRANCH_ACCOUNT_SYNC;
/

hostaccounts - это тип, который я использую в хранимой процедуре в качестве параметра IN.

create or replace PACKAGE BODY DIGX_HOST_BRANCH_ACCOUNT_SYNC IS
PROCEDURE HOST_BRANCH_ACCOUNT_SYNC (target_unit IN VARCHAR2, hostaccounts IN HostBranchAccountListResponse) 
IS
BEGIN

 FOR I in 1 .. hostaccounts.count loop

UPDATE digx_am_account_exception set ACCOUNT_NUMBER = hostaccounts(I).newBranchID || hostaccounts(I).accountNumber 
where ACCOUNT_NUMBER = hostaccounts(I).oldBranchID || hostaccounts(I).accountNumber and 
DETERMINANT_VALUE = target_unit;

end loop;
commit;
END;
END DIGX_HOST_BRANCH_ACCOUNT_SYNC;
/

С кодом выше я получаю неверный тип столбца

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Invalid column type
Error Code: 17004
Call: BEGIN DIGX_HOST_BRANCH_ACCOUNT_SYNC.HOST_BRANCH_ACCOUNT_SYNC(target_unit=>?, hostaccounts=>?); END;
    bind => [2 parameters bound]
Query: ResultSetMappingQuery()
    at com.ofss.fc.infra.das.orm.eclipselink.EclipseLinkStoredProcedureWrapper.execute(EclipseLinkStoredProcedureWrapper.java:125)
    ... 5 more
Caused by: java.sql.SQLException: Invalid column type
...