1

我正在使用 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: Invalid scale size。不能小于零'。

调用表的sql是:

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

BEGCOL 和 COLLENGTH 列属于未定义精度的数据类型 number。

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

Java 数据库连接 (JDBC) - 填充 CachedRowSet 产生 SQLException: Invalid scale size

使用带有子查询分解 SQL 的 queryForRowSet 会产生错误

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

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

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

4

5 回答 5

2

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

java -Doracle.jdbc.J2EE13Compliant=true

于 2009-08-13T19:38:19.703 回答
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());
于 2009-04-14T15:37:29.127 回答
1

如果您使用的是 oracle 10g,并且您的数字列定义为数字且没有比例大小

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

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

检查数字字段的表结构。

我希望这可以帮助你。

于 2011-02-22T14:23:28.257 回答
0

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

下载链接:Oracle JDBC 驱动程序

于 2009-03-19T16:02:28.800 回答
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 异常是否仍在发生?

于 2009-04-10T15:43:53.607 回答