【问题标题】:resultsetmetadata.getScale() returns 0 when using aggregate functions like min or max使用 min 或 max 等聚合函数时,resultsetmetadata.getScale() 返回 0
【发布时间】:2012-07-19 18:29:30
【问题描述】:

在 java 应用程序中,我从 oracle 数据库中选择数值。我需要知道所选值的逗号右边的位数,所以我使用了ResultSetMetaData 类的getScale() 方法。只要我在select 语句中不使用诸如 min、max... 之类的聚合函数,这种方法就可以正常工作。当使用最小值或最大值时,getScale() 返回 0。ColumnType 仍然与列值相同的(NUMERIC)

任何想法可能是什么原因?此外,我仍在寻找一种不太尴尬的解决方法。

我们使用:oci driver, Java 6, Oracle 10g

【问题讨论】:

    标签: java oracle jdbc metadata


    【解决方案1】:

    一般来说,任何表达式都是未知规模的。例如,数字列的AVG 不能依赖于该列的原始比例。由客户来处理。除非您有实际值,否则您怎么知道SUM 的精度?同样,通过RTRIMREPLACE 函数返回的字符串的长度是多少?在查看整个结果集的实际值之前,您无法知道。

    也许在 SQL 本身中,您可以知道合适的比例是多少。这个问题建议使用cast 到适当的类型。

    ResultSetMetaData getScale returns 0

    在您的情况下,您询问的是minmax。它们的特殊之处在于它们保持了色谱柱的比例和精度。也许不在驱动程序中,但从逻辑上讲,它们确实如此。如果您必须知道比例,则可以使用java.sql.DatabaseMetadata 方法查看列本身的元数据而不是结果集的元数据。

    【讨论】:

    • 非常感谢您的全面回答。我对 sql 语句没有太大的影响,所以转换和数据库元数据对我来说不是可用的选项。你知道如何从java中获取使用的逗号字符,所以我可以按照你说的来查看值吗?虽然它没有解决我的问题,但我将您的帖子标记为解决方案,因为它是我问题的完美答案。谢谢
    • 对于数字列,一种选择是始终使用getBigDecimal() 检索并从中计算出比例。
    猜你喜欢
    • 2021-06-06
    • 2021-10-09
    • 2017-06-21
    • 2017-08-24
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 2019-09-13
    相关资源
    最近更新 更多