2

使用带有绑定变量的 JDBC 准备语句将 BigDecimal 值插入 NUMERIC 列时,小数部分会丢失。另一方面,不使用绑定变量时,保留小数部分。

create table DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL numeric)
String connectionString = "jdbc:bigquery://${host}:${port};ProjectId=${projectId};OAuthType=${OAuthType};OAuthServiceAcctEmail=${OAuthServiceAcctEmail};OAuthPvtKeyPath=${OAuthPvtKeyPath}"
Class.forName("com.simba.googlebigquery.jdbc42.Driver").newInstance()
Connection connection = DriverManager.getConnection(connectionString)

// insert statement without bind variable
PreparedStatement preparedStatement = connection.prepareStatement
    ("insert into `${projectId}`.DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL) values (123.45)")
preparedStatement.executeUpdate()

// insert statement using bind variable
preparedStatement = connection.prepareStatement
    ("insert into `${projectId}`.DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL) values (?)")
preparedStatement.setBigDecimal(1, new BigDecimal("567.89")) 
preparedStatement.executeUpdate()
preparedStatement.close() 

我期望输出:

+-------------+
| NUMERIC_COL |
+-------------+
| 123.45      |
| 567.89      |
+-------------+

但实际输出是

+-------------+
| NUMERIC_COL |
+-------------+
| 123.45      |
| 567         |
+-------------+

这是一个错误还是我错过了什么?

4

1 回答 1

1

我能够复制您的场景,因为我的 BigDecimal 值也被四舍五入。尽管如此,在深入研究之后,我发现报告了一个问题,其中传递给的 BigDecimal 值PreparedStatement被四舍五入到最接近的整数。我建议订阅它以跟踪其更新。解决方法是使用:

PreparedStatement preparedStatement = connection.prepareStatement
    ("insert into `${projectId}`.DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL) values (123.45)")
preparedStatement.executeUpdate()

正如你已经在做的那样。

希望能帮助到你。

于 2019-08-20T19:50:48.440 回答