2009-03-13 10 views
1

Ich verwende Spring-2.5.6, um von einer eigenständigen Anwendung zu einer Oracle 10g-Datenbank (ojdbc14.jar) über die org.apache.commons.dbcp.BasicDataSource zu verbinden. Wenn ich versuche, ein SqlRowSet mit der public SqlRowSet queryForRowSet(String sql, Object[] args) throws DataAccessException Methode abzurufen, bekomme ich eine 'java.sql.SQLException: Ungültige Maßstabsgröße. Kann nicht kleiner als Null sein.Ungültige Maßstabsgröße. Kann nicht weniger als Null sein

Die SQL die Tabelle Aufruf ist:

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

Die Säulen BEGCOL und COLLENGTH der Datentypnummer sind ohne Präzision definiert.

Ich habe einige Informationen zu diesem Problem gefunden, scheint eine Inkompatibilität zwischen den Oracle-Treibern und Sun-Implementierung der com.sun.rowset.CachedRowSetImpl.

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

Using queryForRowSet with subquery factoring SQL gives errors

Sie schlagen vor, die SQL auf die folgende als Arbeit um ändern.

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

Hat jemand eine bessere allgemeine Lösung kennen, die definiert keine benutzerdefinierte SQL für jede vorhandene Tabelle beinhaltet, wo eine Spalte nicht Präzision hat?

Antwort

1

Ich habe schließlich eine ResultSetExctractor-Klasse erstellt, die ResultSetExtractor implementiert und verwendet, um eine OracleCachedRowSet-Implementierung von SqlRowSet zu erhalten. Um dies zu verwenden, müssen Sie den Oracle-Treiber jar in Ihr Projekt einfügen (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(); 
    } 
} 

Dies wird dann auf folgende Weise verwendet, um ein SqlRowSet zu extrahieren.

0

Was Oracle Jar verwenden Sie? Versuchen Sie, auf die neueste Version zu aktualisieren (vorausgesetzt, Sie verwenden JDK 5 oder höher). Ich glaube, dass das letzte Problem mit ojdbc5.jar [oder ojdbc6.jar] behoben wurde - es wurde dadurch verursacht, dass die Treiber von Oracle die CachedRowSet-Schnittstelle nicht korrekt unterstützten. Link-

Download: Oracle JDBC Drivers

+0

Eingeschränkt auf Oracle 10g – Rob

+0

Diese JARs funktionieren gut mit 10g. – Gandalf

0

Diese Abfrage:

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(?, '') 

ist die SQL-Ausnahme noch auftreten?

2

Dieser Fehler wird durch eine Inkompatibilität in den Oracle JDBC-Treibern verursacht. Sie können es beheben, indem Sie die Systemeigenschaft oracle.jdbc.J2EE13Compliant auf true setzen. Zum Beispiel auf der Kommandozeile:

java -Doracle.jdbc.J2EE13Compliant=true

1

wenn Sie Oracle 10g verwenden und die Anzahl Spalten mit Anzahl und ohne Skalierungsgrößen-

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

während bevöl FIELD2 definiert, erhalten Sie diese Ausnahme .

Überprüfen Sie Ihre Tabellenstruktur auf Nummernfelder.

Ich hoffe, dass dies Ihnen helfen kann.

Verwandte Themen