使用Oracle+Java的小心!
2007-01-10 11:04
393 查看
创建一个简单表: TABLE TEST_TABLE ,做下面的测试
public static void main(String[] args) throws Exception
{
Class.forName ("oracle.jdbc.OracleDriver");
Connection connection = null;
try
{
connection = (Connection) DriverManager.getConnection ("some_oci_url", "user", "****");
String query = "insert into test_table values (?)";
PreparedStatement stmt = connection.prepareStatement(query);
BigDecimal bd = new BigDecimal(new Double(12500000).toString());
stmt.setBigDecimal(1, bd);
stmt.execute();
}
finally
{
if(connection != null)
connection.close();
}
}
作好准备;
select * from test_table
VALUE
-----
1250000
结果少了一个零!
Oracle已经知道这个严重的BUG,并表示将在11G的时候修复(大概在2010年)
如果BigDecimal bd = new BigDecimal("12500000");则不会有问题
这个BUG的产生原因是 JDK1。4 升级到JDK5的时候,BigDecimal.toString()的实现方法重新写了。JDK5的时候它会根据需要返回科学表示法,而JDK1。4 只调用
测试:
package kompakar.tutorial.test.jdk14to5;
import java.math.BigDecimal;
/** *//**
* 测试BigDecimal.toString()
* @author wuxuefeng@kompakar.com.cn
*
*/
public class BigDecimalTest ...{
/** *//**
* @param args
*/
public static void main(String[] args) ...{
//用科学表示法创建BigDecimal
System.out.println(new Double(12500000).toString());
BigDecimal value = new BigDecimal(new Double(12500000).toString());
System.out.println(value.toString());
//用字符串创建BigDecimal
System.out.println(new BigDecimal(value.toPlainString()).toString());
//用int创建BigDecimal. int是4bytes,最大只能表示-2,147,483,648 to 2,147,483,647
System.out.println(new BigDecimal(12500000).toString());
}
}
参考:
http://www.javalobby.org/java/forums/t88158.html
http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#toString()
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#toEngineeringString()
public static void main(String[] args) throws Exception
{
Class.forName ("oracle.jdbc.OracleDriver");
Connection connection = null;
try
{
connection = (Connection) DriverManager.getConnection ("some_oci_url", "user", "****");
String query = "insert into test_table values (?)";
PreparedStatement stmt = connection.prepareStatement(query);
BigDecimal bd = new BigDecimal(new Double(12500000).toString());
stmt.setBigDecimal(1, bd);
stmt.execute();
}
finally
{
if(connection != null)
connection.close();
}
}
作好准备;
select * from test_table
VALUE
-----
1250000
结果少了一个零!
Oracle已经知道这个严重的BUG,并表示将在11G的时候修复(大概在2010年)
如果BigDecimal bd = new BigDecimal("12500000");则不会有问题
这个BUG的产生原因是 JDK1。4 升级到JDK5的时候,BigDecimal.toString()的实现方法重新写了。JDK5的时候它会根据需要返回科学表示法,而JDK1。4 只调用
Character.forDigit(int, int)返回字符串,相应的方法在JDK5是BigDecimal.toPlainString()。应该说JDK5中BigDecimal.toString()的实现更科学,可是Oracle驱动不买帐。
测试:
package kompakar.tutorial.test.jdk14to5;
import java.math.BigDecimal;
/** *//**
* 测试BigDecimal.toString()
* @author wuxuefeng@kompakar.com.cn
*
*/
public class BigDecimalTest ...{
/** *//**
* @param args
*/
public static void main(String[] args) ...{
//用科学表示法创建BigDecimal
System.out.println(new Double(12500000).toString());
BigDecimal value = new BigDecimal(new Double(12500000).toString());
System.out.println(value.toString());
//用字符串创建BigDecimal
System.out.println(new BigDecimal(value.toPlainString()).toString());
//用int创建BigDecimal. int是4bytes,最大只能表示-2,147,483,648 to 2,147,483,647
System.out.println(new BigDecimal(12500000).toString());
}
}
参考:
http://www.javalobby.org/java/forums/t88158.html
http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#toString()
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#toEngineeringString()
相关文章推荐
- 在Oracle中使用Java存储过程
- 如何在Oracle中使用Java存储过程 (详解)
- Java开发FTP功能的apache工具包,小心使用为妙
- Java ExecutorService使用要小心
- java 字符串split有很多坑,使用时请小心!!
- Java连接访问Oracle--Connection.setSavepoint()方法使用
- 在Java中使用Oracle blob
- Java使用JDBC连接Oracle_MSSQL实例
- Oracle使用JAVA发送HTTP请求
- oracle---使用java
- 使用java + oracle插入clob类型的数据
- 使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine (转载)
- Oracle 中Java 对象与PL/SQL类型的映射及使用
- JDBC之java使用oracle中scott表实现增删改查.1
- 在java中使用oracle绑定变量
- 使用JPublisher生成Oracle自定义类型的Java对象
- Java 使用JDBC连接Oracle
- 如何在Oracle中使用Java存储过程(详解)
- 使用Oracle SQL Developer报错:Unable to find a Java ...
- 使用PPA在Elementary OS 'Luna'上安装Oracle Java 7