powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Запись содержимого файла в CLOB поле таблицы Oracle
14 сообщений из 14, страница 1 из 1
Запись содержимого файла в CLOB поле таблицы Oracle
    #39331018
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Прошу помощи, замучился. 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
Запись содержимого файла в CLOB поле таблицы Oracle
    #39331025
Andrei T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте java.io.InputStreamReader с указанием кодировки файла
...
Рейтинг: 0 / 0
Запись содержимого файла в CLOB поле таблицы Oracle
    #39331026
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Запись содержимого файла в CLOB поле таблицы Oracle
    #39331043
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorD,

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

Код: 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
Запись содержимого файла в CLOB поле таблицы Oracle
    #39340183
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по поводу загрузки файла в Clob. Возможно ли загружать файл в той кодировке, в какой он есть, без распознавания кодировки, перекодировки и т.п.. Подозреваю, что это возможно только с Blob полями.
...
Рейтинг: 0 / 0
Запись содержимого файла в CLOB поле таблицы Oracle
    #39340194
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно. CLOB хранит данные в кодировке БД. Поэтому, если вы хотите сохранить оригинальную кодировку файла, не распознавая её, то только BLOB.
...
Рейтинг: 0 / 0
Запись содержимого файла в CLOB поле таблицы Oracle
    #39340196
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВерно. CLOB хранит данные в кодировке БД. Поэтому, если вы хотите сохранить оригинальную кодировку файла, не распознавая её, то только BLOB.

Спасибо!
...
Рейтинг: 0 / 0
Запись содержимого файла в CLOB поле таблицы Oracle
    #39340985
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дает мне покоя вопрос записи данных в кодировке 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
Запись содержимого файла в CLOB поле таблицы Oracle
    #39340995
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorDНе дает мне покоя вопрос записи данных в кодировке UTF8 в Clob :)
вам длины обычного поля текст не хватает что ли?
...
Рейтинг: 0 / 0
Запись содержимого файла в CLOB поле таблицы Oracle
    #39340997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorD,

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



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

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


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