【问题标题】:JDBC insert real arrayJDBC插入真实数组
【发布时间】:2014-05-22 17:16:02
【问题描述】:

我正在尝试将一个真实数组插入到 postgresql 数组中:

表定义为:

String sqlTable = "CREATE TABLE IF NOT EXISTS ccmBlock"
                + "   sampleId             INTEGER,"
                + "   block                REAL[])";

插入是:

String sqlInsert = "INSERT INTO ccmBlock"
                 + "(sampleId, block) VALUES" 
                 + "(?,?)"; 
PreparedStatement preparedStatement = theConnection.prepareStatement(sqlInsert);

preparedStatement.setInt(1, 1); 

Object[] theArray = {.11f, .22f, .33f};
Array a = theConnection.createArrayOf("real", theArray);  
preparedStatement.setArray(2, a); 

我收到一条消息: org.postgresql.util.PSQLException:找不到提供的名称真实的服务器数组类型。

但是在他们的文档页面上: http://www.postgresql.org/docs/8.4/static/datatype-numeric.html

表 8-2。数值类型

名称 StorageSize 描述范围

实数 4 字节可变精度,不精确的 6 位小数精度

【问题讨论】:

  • Java“浮点”字面量的类型是double,所以是8字节。您是否为您的阵列尝试过{.11f, .22f, .33f}
  • 该消息抱怨它找不到服务器的真实类型,而不是数组格式错误。我试过你的建议,结果是一样的。当我第一次尝试应用程序的这一部分时,我使用了浮点数,当我试图让它工作时我变得懒惰了。
  • 啊,你说得对,我错过了。但是,postgresql jdbc 驱动程序不知道"real" 类型,显然它被称为float4
  • 没错,我搜索了所有我能想到的东西,你在哪里找到的?特别是当它正确创建表格时。

标签: sql arrays postgresql jdbc


【解决方案1】:

Postgresql JDBC 驱动程序对类型的命名有自己的想法。您可以在TypeInfoCache class 中查找它们。

在您的情况下,正确的名称是 float4,所以该行将变为:

Object[] theArray = {.11f, .22f, .33f};
Array a = theConnection.createArrayOf("float4", theArray); 

Props 转到 @JBNizet 以在 similar question 中建议此注册表。

【讨论】:

  • 使用namedParameterJdbcTemplate..getJdbcOperations().execute((ConnectionCallback<Array>) con -> con.createArrayOf("float4", arr)); 我仍然得到Unable to find server array type for provided name REAL. - org.postgres:postgresql:42.2.19
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多