Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Запись содержимого файла в CLOB поле таблицы Oracle / 14 сообщений из 14, страница 1 из 1
20.10.2016, 19:28
    #39331018
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Добрый день!
Прошу помощи, замучился. Java только начал изучать. Пишу загрузчик файлов в таблицы Оракла. Кое что получается, но чувство того, что сделано это не оптимально меня не покидает. Есть процедура в Oracle в которую нужно передать значение типа clob и прочитать clob. Файл с данными находится в файловой системе. Кодировка файла Windows-1251.
Данные в базу попадают с искаженной кодировкой (кириллица заменена знаками вопросов).

Возможно у вас есть наработки по этой теме, поделитесь пожалуйста или подскажите направление.
Спасибо.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
    //---------------------------------------------------------------------------------------------------------------//
    private static String readFile(String fileName, Writer writerArg)
            throws FileNotFoundException, IOException {

        BufferedReader br = new BufferedReader(new FileReader(fileName));
        String nextLine = "";
        StringBuffer sb = new StringBuffer();
        while ((nextLine = br.readLine()) != null) {
            writerArg.write(nextLine);
            sb.append(nextLine);
        }
        // Convert the content into to a string
        String clobData = sb.toString();

        // Return the data.
        return clobData;
    }

    //----------------------------------------------------------------------------------------------------------------//
    private static void callOracleStoredProc(String fileName, String typeData) throws SQLException {

        Connection dbConnection = null;
        String StoredProc ="{call load_cust(?,?,?)}";  // parameters: string, clob, clob
        CallableStatement callableStatement = null;

        try {
            dbConnection = getDBConnection();
            Clob xmlFile = dbConnection.createClob();
            Writer clobWriter = xmlFile.setCharacterStream(1);
            String str = readFile(fileName, clobWriter);
            xmlFile.setString(1,str);


            Clob RezultFile = dbConnection.createClob();
            callableStatement = dbConnection.prepareCall(StoredProc);

            callableStatement.setString(1, fileName);
            callableStatement.setClob(2,xmlFile);
            callableStatement.registerOutParameter(3, java.sql.Types.CLOB);

            callableStatement.execute();

        } catch (SQLException e) {
            log.error(e.getMessage());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (callableStatement != null) {
                callableStatement.close();
            }
            if (dbConnection != null) {
                dbConnection.close();
            }
        }

    }
...
Рейтинг: 0 / 0
20.10.2016, 19:35
    #39331025
Andrei T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Используйте java.io.InputStreamReader с указанием кодировки файла
...
Рейтинг: 0 / 0
20.10.2016, 19:35
    #39331026
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
1) RTFM по FileReader нам сообщает
RTFM The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate

2) Можно указать явно через -Dfile.encoding в параметрах запуска желаемую кодировку cp1251

3) Зачем-то вы строку пишете в CLOB двумя способами сразу. Один через Writer, второй через setString
...
Рейтинг: 0 / 0
20.10.2016, 20:11
    #39331043
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
IgorD,

Если использовать Apache Commons IOUtils и конструкцию try with resource, то можно половину кода выкинуть.
...
Рейтинг: 0 / 0
21.10.2016, 11:10
    #39331321
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Спасибо всем, кто откликнулся. Мой рабочий вариант:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    //----------------------------------------------------------------------------------------------------------------//
    private static void callOracleStoredProc(String fileName, String typeData) throws SQLException {

        Connection dbConnection = null;
        String StoredProc =  "{call load_cust(?,?,?)}";}
        CallableStatement callableStatement = null;

        try {
            dbConnection = getDBConnection();
            File file = new File(fileName);

            FileInputStream is = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(is, "CP1251");

            callableStatement = dbConnection.prepareCall(StoredProc);

            callableStatement.setString(1, file.getName());
            callableStatement.setClob(2,isr);
            callableStatement.registerOutParameter(3, java.sql.Types.CLOB);

            callableStatement.execute();


        } catch (SQLException e) {
            log.error(e.getMessage());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (callableStatement != null) {
                callableStatement.close();
            }
            if (dbConnection != null) {
                dbConnection.close();
            }
        }

    }
...
Рейтинг: 0 / 0
02.11.2016, 17:43
    #39340183
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Вопрос по поводу загрузки файла в Clob. Возможно ли загружать файл в той кодировке, в какой он есть, без распознавания кодировки, перекодировки и т.п.. Подозреваю, что это возможно только с Blob полями.
...
Рейтинг: 0 / 0
02.11.2016, 17:52
    #39340194
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Верно. CLOB хранит данные в кодировке БД. Поэтому, если вы хотите сохранить оригинальную кодировку файла, не распознавая её, то только BLOB.
...
Рейтинг: 0 / 0
02.11.2016, 17:53
    #39340196
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
BlazkowiczВерно. CLOB хранит данные в кодировке БД. Поэтому, если вы хотите сохранить оригинальную кодировку файла, не распознавая её, то только BLOB.

Спасибо!
...
Рейтинг: 0 / 0
03.11.2016, 16:36
    #39340985
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Не дает мне покоя вопрос записи данных в кодировке UTF8 в Clob :)
При одинаковых условиях программа на Delphi xe7 (odac) успешно сохраняет файл в поле CLOB в UTF8
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
         sqLoadFile.ParamByName('p_file_name').AsString := ExtractFileName(FileName);
         sqLoadFile.ParamByName('p_xml').AsOraClob.Clear;
         sqLoadFile.ParamByName('p_xml').AsOraClob.OCISvcCtx := DM.OraSession.OCISvcCtx;
         sqLoadFile.ParamByName('p_xml').AsOraClob.CreateTemporary( ltClob );
         sqLoadFile.ParamByName('p_xml').AsOraClob. .LoadFromFile(FileName);
         sqLoadFile.ParamByName('p_xml').AsOraClob.WriteLob;
         sqLoadFile.ExecSQL;
         rceLog.Lines.Add( sqLoadFile.ParamByName('p_result').AsString );
         sqLoadFile.ParamByName('p_xml').AsOraClob.FreeLob;



Не может быть, что на Java нет варианта. Понимаю, что используются разные механизмы доступа к базе, но все же....
Кодировка в базе установлена следующая
Код: powershell
1.
2.
NLS_CHARACTERSET=CL8MSWIN1251
NLS_NCHAR_CHARACTERSET=AL16UTF16
...
Рейтинг: 0 / 0
03.11.2016, 16:45
    #39340995
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
IgorDНе дает мне покоя вопрос записи данных в кодировке UTF8 в Clob :)
вам длины обычного поля текст не хватает что ли?
...
Рейтинг: 0 / 0
03.11.2016, 16:46
    #39340997
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
IgorD,

Забудьте про Delphi. Эта падла спокойно пишет текст в своей текущей кодировке, которая отличается от той что указана в БД.
Не знаю про CLOB, но на всяких VARCHAR-ах я такое видел.
На выходе получаеться барахло типа такого:
Код: java
1.
new String(text.getBytes(charset), charset2);



Я долго с ними бодался, объясняя как важно настроить в БД нужную кодировку и потом её указывать в Java. А они мне перечили мол у них в Delphi и так всё работает (просто некоторые символы почему-то пропадают). Пришлось целый день убить, чтобы разобраться с Delphi проектом и ораклом. Оказалось, эта падла втихаря делает такое убийственное преобразование. И, с одной стороны, вроде всё работает. А с другой стороны определенные символы таки пропадают из-за того что преобразование обратимое далеко не для всех символов.
...
Рейтинг: 0 / 0
03.11.2016, 16:48
    #39341000
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
BlazkowiczЯ долго с ними бодался,
кусок потерялся... у меня были китайские клиенты с Delphi проектом. Где "всё работало". Хотя по факту "всё работало" через задний проход.
...
Рейтинг: 0 / 0
03.11.2016, 16:49
    #39341002
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Petro123,
Размер файла 23 мегабайта. Использую таблицы и структуры уже существующей системы, поэтому что либо менять там получится :).
...
Рейтинг: 0 / 0
03.11.2016, 16:53
    #39341009
IgorD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись содержимого файла в CLOB поле таблицы Oracle
Blazkowicz А с другой стороны определенные символы таки пропадают из-за того что преобразование обратимое далеко не для всех символов.

И я такое наблюдал. Так и есть.
Немного успокоился. Буду сохранять в CP1251
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Запись содержимого файла в CLOB поле таблицы Oracle / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]