我使用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实现之间的不兼容。
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 = ?
有没有人知道一个更好的通用解决方案,它不涉及任何现有的表,其中列没有精确定义?
答案 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异常是否仍在发生?