Данные при загрузке из оракула в greenplum через talend плохо обрабатывают столбцы CLOB

Я использую tOracleConnection для подключения к источнику оракула и tOracleInput для извлечения данных, затем tMap и затем записываю данные в файл, используя < em>tfileoutputdelimited (пользовательский компонент)

Из файла я загружаю данные в Greenplum с помощью tGreenPlumLoad.

Все данные загружаются нормально, за исключением одного столбца с данными CLOB. данные, которые необходимо загрузить как

(CLOB)2*C111*SUB_TYPE_CD2*N118*Tool Investigation2*O10

но данные в колонке говорят

oracle.sql.CLOB@6513543e

Для нескольких записей эта проблема возникает, для других записей данные CLOB загружаются нормально.

Я хочу, чтобы данные CLOB загружались в столбцы для всех записей.


person Harshitha Goli    schedule 02.09.2016    source источник
comment
Я видел, как это происходит, когда я использовал динамический тип, для этого мне пришлось изменить код, который поставляется с talend. Я поднял запрос с ними для того же самого. Какую версию Talend вы используете?   -  person Balazs Gunics    schedule 02.09.2016
comment
@BalazsGunics Я использую корпоративную версию Talend studio 5.6.1.   -  person Harshitha Goli    schedule 02.09.2016


Ответы (1)


В Talend 5.6.1 много багов, это один из них. Когда я пытался использовать динамический тип, я тоже столкнулся с этой проблемой.

Найдите этот файл:

Talend-5.6.1\plugins\org.talend.desinger.routines.tisprovider_5.6.1.20141207_1530\resources\java\routines\system\DynamicUtils.java

Измените следующую процедуру следующим образом:

    public static void readColumnsFromDatabase(Dynamic column, java.sql.ResultSet rs, int fixedColumnCount) throws Exception {
    column.clearColumnValues();
    for (int i = 0; i < column.getColumnCount(); i++) {
        DynamicMetadata dcm = column.getColumnMetadata(i);
        if ("id_String".equals(dcm.getType()) && !"BLOB".equals(dcm.getDbType()) ) {
            column.addColumnValue(rs.getString(fixedColumnCount + i + 1));
        } else if ("id_Date".equals(dcm.getType())) {
            if (DBMSConstants.MSSQL.getDBmsId().equalsIgnoreCase(column.getDbmsId())
                    && !(dcm.getDbType().toLowerCase().indexOf("timestamp") < 0)) {
                column.addColumnValue(rs.getString(fixedColumnCount + i + 1));
            } else if (DBMSConstants.NETEZZA.getDBmsId().equalsIgnoreCase(column.getDbmsId())
                    && "time".equalsIgnoreCase(dcm.getDbType())) {
                column.addColumnValue(rs.getTime(fixedColumnCount + i + 1));
            } else {
                column.addColumnValue(rs.getTimestamp(fixedColumnCount + i + 1));
            }
        } else if ("id_Integer".equals(dcm.getType()) || "id_Long".equals(dcm.getType()) || "id_Double".equals(dcm.getType())
                || "id_Byte".equals(dcm.getType()) || "id_byte[]".equals(dcm.getType()) || "BLOB".equals(dcm.getDbType())
                || "CLOB".equals(dcm.getDbType()) ) {

            //oracle ...
            if ( "LONG RAW".equals(dcm.getDbType()) ) {
                java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
                byte[] buf = new byte[1024];
                java.io.InputStream in = rs.getBinaryStream(fixedColumnCount + i + 1);
                if (in == null) {
                    column.addColumnValue(null);
                    continue;
                }
                int n = 0;
                while ((n=in.read(buf))>=0)
                {
                   baos.write(buf, 0, n);
                }
                in.close();
                column.addColumnValue(baos.toByteArray());
                continue;
            }

            if (rs.getObject(fixedColumnCount + i + 1) == null) {
                column.addColumnValue(null);
                continue;
            }
            if ("id_Integer".equals(dcm.getType())) {
                column.addColumnValue(rs.getInt(fixedColumnCount + i + 1));
            } else if ("id_Long".equals(dcm.getType())) {
                column.addColumnValue(rs.getLong(fixedColumnCount + i + 1));
            } else if ("id_Double".equals(dcm.getType())) {
                column.addColumnValue(rs.getDouble(fixedColumnCount + i + 1));
            } else if ("id_Byte".equals(dcm.getType())) {
                column.addColumnValue(rs.getByte(fixedColumnCount + i + 1));
            } else if ("id_byte[]".equals(dcm.getType())) {
                       column.addColumnValue(rs.getBytes(fixedColumnCount + i + 1));
                    } else if ( "BLOB".equals(dcm.getDbType()) ) {
               column.addColumnValue(rs.getBytes(fixedColumnCount + i + 1));
            } else if ( "CLOB".equals(dcm.getDbType()) ) {
               column.addColumnValue(rs.getString(fixedColumnCount + i + 1));
            }
        } else {
            column.addColumnValue(rs.getObject(fixedColumnCount + i + 1));
        }
    }
}

Это также содержит исправление для типа oracle long raw. Я не совсем уверен, что нужно делать, если вы НЕ используете динамические типы, но на основе этого вы должны проверить, как talend извлекает данные из этого столбца.

Следует использовать: rs.getString(n), а не rs.getObject(n)

Спросите своего представителя Talend, так как у них есть патч для этого поведения примерно год назад.

person Balazs Gunics    schedule 02.09.2016
comment
Привет, как я могу узнать, какую процедуру использует моя работа? Есть ли способ узнать, как talend извлекает данные из столбца? - person Harshitha Goli; 02.09.2016
comment
Можете ли вы опубликовать ссылку здесь, где вы сообщили об этой ошибке команде talend? - person Harshitha Goli; 02.09.2016
comment
Я планирую добавить подпрограмму Java и вызвать tmap. Но можно ли настроить код, который вы упомянули в talend? - person Harshitha Goli; 15.09.2016
comment
Я не понимаю вас, я предоставил вам расположение процедуры и как ее изменить. Что еще я мог сделать? :) - person Balazs Gunics; 15.09.2016
comment
Номер дела 00009467 Oracle CLOB не сопоставлен с id_String. Вам необходимо изменить схему входных компонентов и сопоставить CLOB со строкой java. - person Balazs Gunics; 15.09.2016