2009-03-13 15 views
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」が表示されます。 0より小さくできません。スケールのサイズが無効です。 0より小さくできません

テーブルを呼び出す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 = ? 

カラムに精度が定義されていない既存のテーブルに対してカスタムSQLを使用しない方が良い汎用ソリューションを知っている人はいますか?

答えて

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()); 
0

どのOracle Jarを使用していますか? JDK 5以降を使用していると仮定して、最新のものにアップグレードしてください。私は、最新のojdbc5.jar [またはojdbc6.jar]がこの問題を修正したと考えています。これは、OracleのドライバがCachedRowSetインタフェースを正しくサポートしていないことが原因です。

ダウンロードリンク:Oracle JDBC Drivers

+0

Oracle 10gに制限 – Rob

+0

これらのJARは10gで正常に動作します。 – Gandalf

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例外ですか?

2

このエラーは、Oracle JDBCドライバの非互換性のために発生します。システム・プロパティーoracle.jdbc.J2EE13Compliantをtrueに設定することにより、修正できます。たとえば、コマンドラインで:

java -Doracle.jdbc.J2EE13Compliant=true

1

Oracle 10gを使用している場合は、あなたの番号の列数と無スケールサイズ

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

FIELD2を移入しながら、あなたはこの例外を受け取りますと定義されました。

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

これがあなたを助けてくれることを願っています。

関連する問題