2010-06-16 13 views
5

Połączyłem program Java z bazą danych Oracle przy użyciu JDBC. Chcę przechowywać wartości BigInteger (512 bitów) w bazie danych. Jaki powinien być typ kolumny?sposób przechowywania wartości BigInteger w bazie danych Oracle

ja usiłuję tak:

Brałem kolumnę rodzaju numeru w bazie danych.

konwertowane BigInteger do BigDecimal jak ten:

BigInteger b=new BigInteger("5779857570957802579079"); 
Number n =b; 
BigDecimal d=(BigDecimal)n; 

PreparedStatement pstmt=con.prepareStatemant("insert into database values(?,?)"); 
pstmt.setString(1,"john"); 
pstmt.setBigDecimal(2,d); 

otrzymuję następujący wyjątek:

 
javax.servlet.ServletException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.math.BigDecimal 
root cause 

java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.math.BigDecimal 

Czy jest coś złego w tym fragmencie kodu? Jeśli tak, proszę zasugeruj inne metody.

+0

proszę sformatować pytanie z listy. Niektóre wskazówki [tutaj] (http://stackoverflow.com/editing-help) – bdhar

+0

Czy mogę przechowywać BigDecimal w kolumnie NUMBER typ – condinya

Odpowiedz

0

Ja nie odpowiadając wprost na Twoje pytanie, ale widzę tylko jeden typ danych Oracle, które można zapisać numer 512 bitów: varchar2 (156) (156 = abs (log (2^512)) + 2)

Więc wolałbym raczej przekonwertować biginteger na ciąg niż bigdekim.

+0

Użyłem varchar2 (4000) i działa. – condinya

+0

"RAW (64)" też by działało. –

3

Zarówno BigInteger, jak i BigDecimal extend java.lang.Number, jednak nie oznacza to, że można przesyłać z BigInteger do Number, a następnie do BigDecimal.

Jest konstruktor w BigDecimal, która zajmuje BigInteger, więc spróbuj:

BigDecimal d = new BigDecimal(b); 
+0

próbowałem, ale otrzymuję kolejny wyjątek. javax.servlet.ServletException: java.sql.SQLException: [Oracle] [ODBC] Nieprawidłowa wartość precyzji. podstawowa przyczyna Wykrywanie java.sql.SQLException: [Oracle] [ODBC] Nieprawidłowa wartość precyzji – condinya

+0

Możliwe, że typ kolumny, do której wstawiasz, nie akceptuje BigDecimal? – DaveJohnston

0

Możesz użyć wartości dziesiętnej/numerycznej w zależności od limitów db.

0

można spróbować w ten sposób:

oracle.sql.NUMBER numberValue = new oracle.sql.NUMBER(bigIntegerValue); 
cs.setObject(id, numberValue, OracleTypes.NUMBER); 

gdzie bigIntegerValue jest instancją java.math.BigInteger, to działa na mnie

+0

Wciąż nie zmieściłoby się w kolumnie NUMBER, ponieważ NUMBER typ danych jest ograniczony do około 40 cyfr maks. –

Powiązane problemy