В таблице Oracle PLSQL объекта есть параметр, который заполняется в Oracle 11g, но не заполняется в Oracle 12c. - PullRequest
0 голосов
/ 06 декабря 2018

Странная проблема ...

У меня есть этот массив 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

...