powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JAVA & JDBC(Oracle)
17 сообщений из 17, страница 1 из 1
JAVA & JDBC(Oracle)
    #34246475
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите кто может/знает!!!!

есть такой код (немного топорно, но суть должна быть понятна)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
.....
String buff="insert into TEST (col_1) values (?)";
prStmt=conn.prepareStatement(buff);

buff = "5.05";
prStmt.setDouble(  1  ,  Double .parseDouble(buff) );
res=prStmt.execute();
.....

так вот в чем собственно проблемма:
есть в Oracle установленна "." десятичным разделителем всё работает.
если же "," - вываливаеться ошибка "ORA-00913: too many values"

Всякие приемы типа " alter session set NLS_TERRITORY='AMERICA' " пробывал - не помогает.
P.S. Данный класс загружаеться в Oracle.
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246499
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thin или oci?
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246519
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
thin, драйвер jdbc используеться оракловый.
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246528
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalexakathin или oci?
sorry я затупил Али-бабаДанный класс загружаеться в Oracle
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246578
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может у вас
Код: plaintext
 Double .parseDouble(buff)
слетает

Код: plaintext
1.
prStmt.setDouble(  1  ,  Double .parseDouble(buff) );
res=prStmt.execute();

так и идут в коде друг за другом?
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246583
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а NLS параметры вы установить не можете ибо они заданы созданной сессией снаружи
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246587
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем для парса использовать Double? Если четко знаешь, какая локаль нужна, юзай:
Код: plaintext
1.
2.
3.
4.
     public   static   final  NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
    ....
    prStmt.setDouble(  1  , nf.parse(buff).doubleValue() );
    ...
Вообще для такого парса всегда смотри NumberFormat/DecimalFormat/DecimalFormatSymbols.
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246597
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите в сторону TO_NUMBER
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246604
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zalexakaможет у вас
Код: plaintext
 Double .parseDouble(buff)
слетает

Код: plaintext
1.
prStmt.setDouble(  1  ,  Double .parseDouble(buff) );
res=prStmt.execute();

так и идут в коде друг за другом?
да вроде нет... ошибка была бы другая...
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246608
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗашедшийЗачем для парса использовать Double? Если четко знаешь, какая локаль нужна, юзай:
Код: plaintext
1.
2.
3.
4.
     public   static   final  NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);
    ....
    prStmt.setDouble(  1  , nf.parse(buff).doubleValue() );
    ...
Вообще для такого парса всегда смотри NumberFormat/DecimalFormat/DecimalFormatSymbols.
спасибо за совет, буду пробывать...
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246645
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще немного размышлений по сабжу.

Число всегда в buff попадает в виде "5.05", запятой быть не может.
Парситься тоже нормально.
А вот JDBC, когда разделителем в настройках стоит "," воспринимает число вида "5.05" как ДВА значения, и валит ошибку приведенную выше.
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246689
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Али-бабаЕще немного размышлений по сабжу.

Число всегда в buff попадает в виде "5.05", запятой быть не может.
Парситься тоже нормально.
А вот JDBC, когда разделителем в настройках стоит "," воспринимает число вида "5.05" как ДВА значения, и валит ошибку приведенную выше.
Чтото скрываете. Давайте тест кейс.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace and compile java source named test_double as
 import  java.sql.*;

 public   class  test_double
{
     public   static  String test()  throws  SQLException
    {
        Connection conn = getConnection();
        PreparedStatement pstmt = conn.prepareStatement("select ? from dual");
        String d = "5.05";
        pstmt.setDouble( 1 ,  Double .parseDouble(d));
        ResultSet rs = pstmt.executeQuery();
        rs.next();
         return  rs.getString( 1 );
    }
     private   static  Connection getConnection()  throws  SQLException {
         return  DriverManager.getConnection("jdbc:default:connection:");
    }
}
/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
TIM@test>;alter session set nls_numeric_characters=',.';

Session altered.

TIM@test>;select testdouble from dual;

TESTDOUBLE
-------------------------------------------------------
 5 , 05 

 1  row selected.

TIM@test>;alter session set nls_numeric_characters='.,';

Session altered.

TIM@test>;select testdouble from dual;

TESTDOUBLE
-------------------------------------------------------
 5 . 05 
ЗЫ. 10g
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246763
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какбы скрывать то и нечего.
Насчет ссесии я согласен, но только я немогу заставить JDBC проинсертить "5,05", ну или привести его с такому виду/типу чтобы прошел insert.
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34246800
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Али-баба wrote:

> Насчет ссесии я согласен, но только я немогу заставить JDBC проинсертить
> "5,05", ну или привести его с такому виду/типу чтобы прошел insert.

Так у тебя в Java строка с запятой или с точкой, т.е. "5,05" или "5.05"?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34247241
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
Али-баба wrote:

> Насчет ссесии я согласен, но только я немогу заставить JDBC проинсертить
> "5,05", ну или привести его с такому виду/типу чтобы прошел insert.

Так у тебя в Java строка с запятой или с точкой, т.е. "5,05" или "5.05"?


число "5.05", но из-за различных настроек оракла, на одних серверах инсерт проходит (где разделитель "."), а на других нет (где разделитель ",").
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34248105
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Али-бабачисло "5.05", но из-за различных настроек оракла, на одних серверах инсерт проходит (где разделитель "."), а на других нет (где разделитель ",").
У меня везде проходит:
Код: plaintext
create table TEST (dvalue number( 15 , 4 ));

Код: 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.
create or replace and compile java source named "DoubleTest" as
 import  java.sql.*;

 public   class  DoubleTest {

   public   static   void  foo()
     throws  Exception {
    Connection con =  null ;
    Statement st =  null ;
    PreparedStatement pst =  null ;
     try  {
      con = DriverManager.getConnection("jdbc:default:connection:");

      pst = con.prepareStatement("insert into TEST (dvalue) values (?)");

      st = con.createStatement();

      st.execute("alter session set nls_numeric_characters=', '");
      pst.setDouble( 1 ,  Double .parseDouble("5.05"));
      pst.execute();

      st.execute("alter session set nls_numeric_characters='. '");
      pst.setDouble( 1 ,  Double .parseDouble("5.05"));
      pst.execute();

      ResultSet rs = st.executeQuery("select * from TEST");
       while  (rs.next()) {
        System.out.println(rs.getDouble( 1 ));
      }
    }  finally  {
       if  (st !=  null ) { st.close();}
       if  (pst !=  null ) { pst.close();}
       if  (con !=  null ) { con.close();}
    }
  }
}
/
Код: plaintext
1.
2.
create or replace procedure double_test as language java name 'DoubleTest.foo()';
/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> set serverout on
SQL> exec dbms_java.set_output( 20000 );

PL/SQL procedure successfully completed.

SQL> exec double_test;
 5 . 05 
 5 . 05 
...
Рейтинг: 0 / 0
JAVA & JDBC(Oracle)
    #34248316
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
....
      st.execute("alter session set nls_numeric_characters=', '");
      pst.setDouble( 1 ,  Double .parseDouble("5.05"));
      pst.execute();

      st.execute("alter session set nls_numeric_characters='. '");
      pst.setDouble( 1 ,  Double .parseDouble("5.05"));
      pst.execute();

      ResultSet rs = st.executeQuery("select * from TEST");
       while  (rs.next()) {
        System.out.println(rs.getDouble( 1 ));
      }
.....
  }
}
/

всё правильно. Я уже создал у себя еще один экземпляр оракла с настройками по умолчанию "," - работает.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JAVA & JDBC(Oracle)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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