Странная проблема ...
У меня есть этот массив PL / SQL:
create or replace MY_TYPE_ARRAY
AS TABLE OF MY_TYPE ;
create or replace TYPE MY_TYPE AS OBJECT
(
PARAM1 VARCHAR2(100),
PARAM2 VARCHAR2(35),
PARAM3 VARCHAR2(35),
PARAM4 NUMBER(20,2),
PARAM5 DATE ,
PARAM6 VARCHAR2(12),
PARAM7 VARCHAR2(10),
PARAM8 VARCHAR2(1),
PARAM9 VARCHAR2(20)
);
этот массив заполняется в Java-приложении через MyBatis TypeHandler:
public void setParameter(PreparedStatement ps, int i, List<MyObject> parameter, JdbcType jdbcType)
throws SQLException {
Connection connection = ps.getConnection();
Struct[] structs = null;
if (parameter != null && parameter.size() > 0) {
structs = new Struct[parameter.size()];
for (int index = 0; index < parameter.size(); index++) {
MyObject myObject= parameter.get(index);
Object[] params = new Object[9];
params[0] = myObject.getParam1();
params[1] = myObject.getParam2();
params[2] = myObject.getParam3();
params[3] = myObject.getParam4();
params[4] = myObject.getParam5();
params[5] = myObject.getParam6();
params[6] = myObject.getParam7();
params[7] = myObject.getParam8();
params[8] = myObject.getParam9();
structs[index] = connection.createStruct("MY_TYPE", params);
}
);
} else {
parameter = new ArrayList<MyObject>();
structs = new Struct[0];
}
this.parameter = parameter;
Array oracleArray = ((OracleConnection) connection).createOracleArray("MY_TYPE_ARRAY", structs);
ps.setArray(i, oracleArray);
}
Теперь проблема в том, что после того, как значение передано в хранимую процедуру, поле PARAM3 иногда заполнено правильно и иногда равно нулю:
Подпись хранимой процедуры:
CREATE PROCEDURE MY_PROC (IN_PARAM_1 IN VARCHAR2,
P_MY_TYPE_LIST IN MY_TYPE_ARRAY
)
I INTEGER := 0;
Часть кода, вызывающая ошибку:
FOR MY_OBJ IN P_MY_TYPE_LIST.FIRST .. P_MY_TYPE_LIST.LAST LOOP
V_STTS := 'S';
I := I + 1;
BEGIN
V_TO_IBAN := P_MY_TYPE_LIST(I).PARAM3; //this value is sometimes read correctly, sometimes null though the value is passed correctly from the java
//V_TO_IBAN := P_MY_TYPE_LIST(MY_OBJ).PARAM3; //same behavior
.
.
.
.
Проблема в последней строке кода, как прокомментировано, код работает нормально в тестовой среде (oracle 11g), но неправильно при постановке (oracle 12c).Связана ли проблема с версией БД?
обновление: используется версия jdbc: com.oracle:ojdbc8:12.0.2