1

org.apache.commons.dbcp.BasicDataSource を使用して、スタンドアロン アプリケーションから Oracle 10g データベース (ojdbc14.jar) に接続するために spring-2.5.6 を使用しています。メソッドを使用して SqlRowSet を取得しようとするとpublic SqlRowSet queryForRowSet(String sql, Object[] args) throws DataAccessException、「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 Database Connectivity (JDBC) - CachedRowSet を設定すると SQLException が生成されます: 無効なスケール サイズ

サブクエリ ファクタリング 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

このエラーは、OracleJDBCドライバの非互換性が原因で発生します。これを修正するには、システムプロパティoracle.jdbc.J2EE13Compliantをtrueに設定します。たとえば、コマンドラインでは次のようになります。

java -Doracle.jdbc.J2EE13Compliant=true

于 2009-08-13T19:38:19.703 に答える
1

Oracle 10g を使用していて、数値列が数値で定義され、スケール サイズがない場合

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

FIELD2 の入力中に、この例外が発生します。

数値フィールドのテーブル構造を確認してください。

これがあなたに役立つことを願っています。

于 2011-02-22T14:23:28.257 に答える
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 に答える
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 に答える