缩放比例无效。不能小于零

时间:2009-03-13 15:36:21

标签: java sql oracle spring oracle10g

我使用spring-2.5.6使用org.apache.commons.dbcp.BasicDataSource从独立应用程序连接到Oracle 10g数据库(ojdbc14.jar)。当我尝试使用public SqlRowSet queryForRowSet(String sql, Object[] args) throws DataAccessException方法检索SqlRowSet时,我得到一个'java.sql.SQLException:缩放比例无效。不能小于零。

调用该表的SQL是:

select CUSTAREADESC, BEGCOL, COLLENGTH from CUSTOMERAREA where upper(trim(FLEET)) = upper(trim(?)) and CUSTAREANO = ?

BEGCOL和COLLENGTH列是数据类型编号,未定义精度。

我发现了一些关于这个问题的信息,似乎是Oracle驱动程序和Sun的com.sun.rowset.CachedRowSetImpl实现之间的不兼容。

Java Database Connectivity (JDBC) - Populating CachedRowSet produces SQLException: Invalid scale size

Using queryForRowSet with subquery factoring SQL gives errors

他们建议将sql更改为以下内容作为解决方法。

select CUSTAREADESC, (BEGCOL + 0) BEGCOL, (COLLENGTH + 0) COLLENGTH from CUSTOMERAREA where upper(trim(FLEET)) = upper(trim(?)) and CUSTAREANO = ?

有没有人知道一个更好的通用解决方案,它不涉及任何现有的表,其中列没有精确定义?

5 个答案:

答案 0 :(得分:2)

此错误是由Oracle JDBC驱动程序中的不兼容引起的。您可以通过将系统属性oracle.jdbc.J2EE13Compliant设置为true来修复它。例如,在命令行上:

java -Doracle.jdbc.J2EE13Compliant=true

答案 1 :(得分:1)

我最终创建了一个实现ResultSetExtractor的ResultSetExctractor类,并使用它来获取SqlRowSet的OracleCachedRowSet实现。要使用它,您需要在项目中包含oracle驱动程序jar(使用ojdbc14.jar)。

public class SqlRowSetOracleResultSetExtractor implements ResultSetExtractor {

    public Object extractData(ResultSet rs) throws SQLException {
        return createSqlRowSet(rs);
    }

    protected SqlRowSet createSqlRowSet(ResultSet rs) throws SQLException {
        CachedRowSet rowSet = newCachedRowSet();
        rowSet.populate(rs);
        return new ResultSetWrappingSqlRowSet(rowSet);
    }

    protected CachedRowSet newCachedRowSet() throws SQLException {
        return new OracleCachedRowSet();
    }
}

然后通过以下方式使用它来提取SqlRowSet。

SqlRowSet rs = (SqlRowSet) this.jdbcTemplate.query(SELECT_CUSTOMER_AREA,
                new Object[]{new SqlParameterValue(Types.VARCHAR, companyId),
                new SqlParameterValue(Types.NUMERIC, areaNumber)},
                new SqlRowSetOracleResultSetExtractor());

答案 2 :(得分:1)

如果您使用的是oracle 10g,并且您的数字列定义了数字且没有缩放尺寸

create table EXAMPLE
(
FILED1 NUMBER(2,0),
FILED2 NUMBER
)    

填充FIELD2时,您将收到此异常。

检查表结构中的数字字段。

我希望这对你有所帮助。

答案 3 :(得分:0)

您使用的Oracle Jar是什么?尝试升级到最新版本(假设您使用的是JDK 5或更高版本)。我相信最新的ojdbc5.jar [或ojdbc6.jar]修复了这个问题 - 它是由Oracle的驱动程序没有正确支持CachedRowSet接口引起的。

下载链接:Oracle JDBC Drivers

答案 4 :(得分:0)

尝试此查询:

select NVL(CUSTAREADESC, '0'), (NVL(BEGCOL,0) + 0) BEGCOL, (NVL(COLLENGTH, 0) + 0) COLLENGTH 
from CUSTOMERAREA 
where NVL(upper(trim(NVL(FLEET, ''))), '') = NVL(upper(trim(NVL(?, ''))), '') 
    and NVL(CUSTAREANO, '0') = NVL(?, '')

SQL异常是否仍在发生?