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

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

Код: 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
10.01.2007, 17:30:35
    #34246499
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
thin или oci?
...
Рейтинг: 0 / 0
10.01.2007, 17:35:50
    #34246519
Али-баба
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
thin, драйвер jdbc используеться оракловый.
...
Рейтинг: 0 / 0
10.01.2007, 17:36:46
    #34246528
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
zalexakathin или oci?
sorry я затупил Али-бабаДанный класс загружаеться в Oracle
...
Рейтинг: 0 / 0
10.01.2007, 17:49:02
    #34246578
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
может у вас
Код: plaintext
 Double .parseDouble(buff)
слетает

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

так и идут в коде друг за другом?
...
Рейтинг: 0 / 0
10.01.2007, 17:50:24
    #34246583
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
а NLS параметры вы установить не можете ибо они заданы созданной сессией снаружи
...
Рейтинг: 0 / 0
10.01.2007, 17:51:18
    #34246587
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
Зачем для парса использовать 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
10.01.2007, 17:54:24
    #34246597
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
посмотрите в сторону TO_NUMBER
...
Рейтинг: 0 / 0
10.01.2007, 17:56:28
    #34246604
Али-баба
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
zalexakaможет у вас
Код: plaintext
 Double .parseDouble(buff)
слетает

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

так и идут в коде друг за другом?
да вроде нет... ошибка была бы другая...
...
Рейтинг: 0 / 0
10.01.2007, 17:58:44
    #34246608
Али-баба
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
ЗашедшийЗачем для парса использовать 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
10.01.2007, 18:10:12
    #34246645
Али-баба
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
Еще немного размышлений по сабжу.

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

Число всегда в 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
10.01.2007, 18:55:16
    #34246763
Али-баба
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
Какбы скрывать то и нечего.
Насчет ссесии я согласен, но только я немогу заставить JDBC проинсертить "5,05", ну или привести его с такому виду/типу чтобы прошел insert.
...
Рейтинг: 0 / 0
10.01.2007, 19:13:22
    #34246800
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
Али-баба wrote:

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

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

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

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


число "5.05", но из-за различных настроек оракла, на одних серверах инсерт проходит (где разделитель "."), а на других нет (где разделитель ",").
...
Рейтинг: 0 / 0
11.01.2007, 11:53:18
    #34248105
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
Али-бабачисло "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
11.01.2007, 12:37:57
    #34248316
Али-баба
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA & JDBC(Oracle)
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
Форумы / Java [игнор отключен] [закрыт для гостей] / JAVA & JDBC(Oracle) / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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