Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер / 16 сообщений из 16, страница 1 из 1
03.06.2005, 17:33
    #33100463
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Если я использую драйвер 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
03.06.2005, 18:03
    #33100531
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Какая версия Oracle и JDBC, какая кодировка базы?
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
03.06.2005, 18:26
    #33100585
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
база 8.1.7 AMERICAN_AMERICA.CL8MSWIN1251

клиент 9.2 AMERICAN_AMERICA.CL8MSWIN1251
(ojdbc14.zip)
...
Рейтинг: 0 / 0
03.06.2005, 18:46
    #33100627
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Попробуй добавить файл nls_charset12.zip к CLASSPATH. Он упоминается здесь: Java: Русские буквы и не только... в разделе Драйвер JDBC-thin от Oracle .
...
Рейтинг: 0 / 0
03.06.2005, 18:57
    #33100648
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Спасибо !
помогло.
...
Рейтинг: 0 / 0
06.06.2005, 10:31
    #33102072
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Осталась проблема с чтением 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
06.06.2005, 12:15
    #33102327
jc_pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Igor-65
clob.getCharacterStream(1).read(buffer,0,(int) clob.length());
String strClob = new String( chunk );
System.out.println(strClob);


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

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

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

Драйвер oci работает нормально.
куда копать ?
...
Рейтинг: 0 / 0
06.06.2005, 12:53
    #33102428
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
полный код процедуры чтения:
Код: 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
06.06.2005, 15:33
    #33102850
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Я поэкспериментировал у себя - ничего лучшего чем записывать в 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
06.06.2005, 16:00
    #33102944
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Спасибо, Денис

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

какойнибудь простой метод кодирования/декодирования моего текста можешь посоветовать ?
...
Рейтинг: 0 / 0
16.06.2005, 16:03
    #33119937
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
нашел способ читать 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
16.06.2005, 16:58
    #33120155
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
ничего себе изврат. :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.07.2016, 08:10
    #39268457
it_andrei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
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
06.07.2016, 08:11
    #39268459
it_andrei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер
Да, кстати, драйвер под оракл всегда использую jdbc:oracle:thin и проблем никогда не было.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема записи в CLOB русских букв через jdbc:oracle:thin драйвер / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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