powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
16 сообщений из 16, страница 1 из 1
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33100463
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я использую драйвер jdbc:oracle:oci8, то код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        String value = "Привет";
        CLOB newClob = oracle.sql.CLOB.createTemporary(connect,
                              false, oracle.sql.CLOB.DURATION_SESSION);
        newClob.open(CLOB.MODE_READWRITE);
        Writer tempClobWriter = newClob.getCharacterOutputStream();
         try  {
              tempClobWriter.write( (String) value);
              tempClobWriter.flush();
              tempClobWriter.close();
        }  catch  (IOException e) {
              e.printStackTrace();
        }
        newClob.close();
        preparedState.setClob(par,newClob);
работает нормально, но если я пытаюсь использовать jdbc:oracle:thin,
то на строке tempClobWriter.flush() вылетаю с сообщением:
"Исключение ввода/вывода: End of TNS data channel ..."

На чтение тоже проблема. С jdbc:oracle:oci8 работает.
При использовании jdbc:oracle:thin получаем сообщение об ошибке
Fail to convert between UTF8 and UCS2

Я понимаю, что можно использовать NCLOB, но вопрос именно в том, как правильно работать с CLOB.

Если надо самому кодировать/декодировать, то подскажите, что надо сделать с String value = "Привет";
перед записью в CLOB (пример кодирования и декодирования при чтении).

Заранее спасибо.
Игорь
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33100531
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая версия Oracle и JDBC, какая кодировка базы?
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33100585
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
база 8.1.7 AMERICAN_AMERICA.CL8MSWIN1251

клиент 9.2 AMERICAN_AMERICA.CL8MSWIN1251
(ojdbc14.zip)
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33100627
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй добавить файл nls_charset12.zip к CLASSPATH. Он упоминается здесь: Java: Русские буквы и не только... в разделе Драйвер JDBC-thin от Oracle .
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33100648
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо !
помогло.
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102072
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Осталась проблема с чтением CLOB при использовании thin-дряйвера :
После добавления nls_charset12.zip при записи в базу все проходит нормально
Пишу : ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.йцукенгшщзхъфывапролджэячсмитьбю.Ё
Вижу в toad то же самое.
Но при чтении в java вижу :
????????????????.????????????????

код чтения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      Statement stmt = connect.createStatement();
      ResultSet rs = stmt.executeQuery("select id,my_clob from iap.tbl_clob ");
       while  (rs.next()) {
           long  id = rs.getLong( 1 );
          System.out.print("ID = " + id + "  ");
          CLOB clob = (CLOB) rs.getClob( 2 );
           char  buffer[] =  new   char [( int ) clob.length()];
          clob.getCharacterStream( 1 ).read(buffer, 0 ,( int ) clob.length());
          String strClob =   new  String(chunk);
          System.out.println(strClob);
      }

где еще грабли ?

Заранее спасибо !
Игорь
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102327
jc_pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor-65
clob.getCharacterStream(1).read(buffer,0,(int) clob.length());
String strClob = new String( chunk );
System.out.println(strClob);


Не buffer ли там должно быть?
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102362
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй просто:
Код: plaintext
String str = clob.getSubString( 1 , ( int )clob.length());
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102372
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да buffer. но проблему не решает.
Причем если я пытаюсь испоьлзовать в базе не CLOB, а NCLOB, то получаю
java.io.IOException: Набор символов не поддерживается !!: DBConversion

если использую CLOB, то получаю ????????

Причем, записывается в базу все правильно: и CLOB, и NCLOB

Драйвер oci работает нормально.
куда копать ?
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102428
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полный код процедуры чтения:
Код: plaintext
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.
     private   Connection localConnection()  throws  SQLException {
        DriverManager.registerDriver( new  oracle.jdbc.driver.OracleDriver());

        //String url = "jdbc:oracle:oci8:@DEV_SERVER";
        String url = "jdbc:oracle:thin:@server:1521:DEV";
        Connection conn = DriverManager.getConnection(url,"i", "mypwd");
         return  conn;
    }


     private   void  test_read() {
         try  {
            Connection connect = localConnection();
            Statement stmt = connect.createStatement();
            ResultSet rs = stmt.executeQuery("select id,my_clob from iap.tbl_clob ");
             while  (rs.next()) {
                 long  id = rs.getLong( 1 );
                System.out.print("ID = " + id + "  ");
                CLOB clob = (CLOB) rs.getClob( 2 );

                StringBuffer strBuff =  new  StringBuffer();
                 int  chunkSize =  4000 ;
                 char  chunk[] =  new   char [chunkSize];
                 int  length = ( int ) clob.length();
                 while  (strBuff.length() < length) {
                     int  readSise = (length-strBuff.length())<chunkSize ? length-strBuff.length() : chunkSize;
                    clob.getCharacterStream(strBuff.length()+ 1 ).read(chunk, 0 ,readSise);
                    strBuff.append(chunk, 0 ,readSise);
                }

                String strClob =   new  String(strBuff);
                 int  zero = strClob.indexOf("");
                 if  (zero != - 1 ) {
                    strClob = strClob.substring( 0 ,zero);
                }
                //String strClob = clob.getSubString(1, (int)clob.length());

                System.out.println(strClob);
            }

            rs.close();
            stmt.close();
            connect.close();

        }  catch  (SQLException e) {
            e.printStackTrace();  
        }  catch  (IOException e) {
            e.printStackTrace();         
        }
    }

String strClob = clob.getSubString(1, (int)clob.length());
не помогло. Эффект тот же. причем, записываю в базу строчку
0) ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.йцукенгшщзхъфывапролджэячсмитьбю.Ё!ё№;%:?*()qwertyuiop[]asdfghjkl;'zxcvbnm,./
а вижу при чтении:
0) ????????????????.????????????????!??;%:?*()qwertyuiop[]asdfghjkl;'zxcvbnm,./
даже количество ? не соответствует кол-ву русских букв.

при чтении String strClob = clob.getSubString(1, (int)clob.length());
из-за неверной перекодировки в хвосте зачитываемого массива образуется мусор из нулевых байт (просим ведь clob.length()).

nls_charset12.zip я забирал с
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102850
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я поэкспериментировал у себя - ничего лучшего чем записывать в CLOB через putChars() , а получать из него через getSubString() не придумывается, во всех остальных случаях идет возня с кодировкой. Причем это можно проверить даже без таблиц - просто заполняя CLOB и вытаскивая из него данные.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
   private   static   final  String RESOURCE =
  "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.йцукенгшщзхъфывапролджэячсмитьбю" +
  "QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?qwertyuiop[]asdfghjkl;'zxcvbnm,.";

   public   static   void  main(String args [])
     throws  Exception {
    Connection con =  null ;
    CLOB clob =  null ;
     try  {
       Class .forName("oracle.jdbc.OracleDriver");
      con = DriverManager.getConnection(SERVER, USERNAME, PASSWORD);
      clob = CLOB.createTemporary(con, true, CLOB.DURATION_SESSION);
      clob.putChars( 1 , RESOURCE.toCharArray());
      System.out.println(clob.getSubString( 1 , ( int ) clob.length()));
    }  finally  {
       if  (clob !=  null ) { CLOB.freeTemporary(clob); }
       if  (con !=  null ) { con.close(); }
    }
  }

Есть шанс перейти на другую версию Oracle и/или изменить кодирову базы на юникод? ИМХО достаточное количество проблем с кодировкой отпадет.
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33102944
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Денис

но...
К сожалению, поменять кодировку базы нельзя.
Как мне сказали, в качестве клиента висит центура, которая не поймет unicod...

какойнибудь простой метод кодирования/декодирования моего текста можешь посоветовать ?
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33119937
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел способ читать clob через thin. Но только с использованием dbms_lob

Код: plaintext
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.
     private   void  test_readByDBMS_LOB() {
         try  {

            DriverManager.registerDriver(
                        new  oracle.jdbc.driver.OracleDriver());
            String url = "jdbc:oracle:thin:@server:1521:DEV";
            String username = "myname";
            String pwd = "mypwd";
            Connection connect = DriverManager.getConnection(
                                url,
                                username, pwd);

            Statement stmt = connect.createStatement();
            ResultSet rs = stmt.executeQuery("select my_clob from tbl_clob t where id = 1");
             while  (rs.next()) {
                CLOB clob = (CLOB) rs.getClob( 1 );
                String buffer="";
                String chunk =  null ;
                String sqlClob =
                        "declare " +
                        " clb CLOB; " +
                        "begin " +
                        " clb := ?; " +
                        " dbms_lob.open(clb,dbms_lob.lob_readonly); " +
                        " dbms_lob.read(clb,?,?,?); " +
                        " dbms_lob.close(clb); " +
                        "end; ";
                CallableStatement cs = connect.prepareCall(sqlClob);
                 int  i =  1 ;
                 while  (chunk== null  || chunk.length()== 4000 ) {
                    cs.clearParameters();
                    cs.setClob( 1 ,clob);
                    cs.setLong( 2 , 4000 );
                    cs.setLong( 3 ,i);
                    cs.registerOutParameter( 4 ,Types.VARCHAR);
                    cs.executeUpdate();
                    chunk = cs.getString( 4 );
                    buffer = buffer + chunk;
                    i +=  4000 ;
                }
                System.out.println(buffer);
                cs.close();
            }

            rs.close();
            stmt.close();
            connect.close();

        }  catch  (SQLException e) {
            e.printStackTrace();
        }
    }

Еще идеи ?
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #33120155
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего себе изврат. :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #39268457
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor-65, вот этот код работает без проблем на oracle. Кодировка базы windows-1251, кодировка java по умолчанию, судя по java.nio.charset.Charset.defaultCharset() UTF-8:



Код: 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.
static void testClob(){
      try (Connection con = DriverManager.getConnection("jdbc:oracle:thin:@ip:1521:db",
            "test", "test")) {
        String testStr = "12345 АаБбЯя AaBbYy";
        
        PreparedStatement pst = con.prepareStatement("insert into it_andrei_test(id, note, clob1) values(?, ?, ?)");
        
        pst.setInt(1, 1);
        pst.setString(2, testStr);
        pst.setClob(3, new StringReader(testStr));        
        pst.executeUpdate();
        
        
        Statement st = con.createStatement();
       
        ResultSet rs = st.executeQuery("select * from it_andrei_test");
        
        while(rs.next()) {
          System.out.println("id: " + rs.getInt("id"));
          System.out.println("note: " + rs.getString("note"));
          
          CLOB clob = (CLOB) rs.getClob("clob1");
          char buffer[] = new char[(int) clob.length()];
          clob.getCharacterStream(1).read(buffer,0,(int) clob.length());
          String strClob =  new String(buffer);
   
          System.out.println("clob1: " + strClob);
        }
        
      } catch (SQLException ex) {
      Logger.getLogger(Test_Java.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
    Logger.getLogger(Test_Java.class.getName()).log(Level.SEVERE, null, ex);
  }
      
}  



А вообще, чтобы избежать проблем с кодировкой, лучше сохранять в BLOB и потом при формировании String просто указывать нужную кодировку. А все эти CLOB и прочие имеют уж очень много скрытых настроек.
...
Рейтинг: 0 / 0
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
    #39268459
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, кстати, драйвер под оракл всегда использую jdbc:oracle:thin и проблем никогда не было.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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