Неверный размер шкалы. Не может быть меньше нуля - PullRequest
1 голос
/ 13 марта 2009

Я использую spring-2.5.6 для подключения автономного приложения к базе данных Oracle 10g (ojdbc14.jar) с помощью org.apache.commons.dbcp.BasicDataSource. Когда я пытаюсь получить SqlRowSet с помощью метода public SqlRowSet queryForRowSet(String sql, Object[] args) throws DataAccessException, я получаю java.sql.SQLException: Invalid size size. Не может быть меньше нуля ».

sql, вызывающий таблицу:

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

Столбцы BEGCOL и COLLENGTH имеют номер типа данных без определенной точности.

Я нашел некоторую информацию по этой проблеме, похоже, что она несовместима с драйверами Oracle и реализацией com.sun.rowset.CachedRowSetImpl от Sun.

Соединение с базой данных Java (JDBC) - заполнение CachedRowSet приводит к SQLException: неверный размер шкалы

Использование queryForRowSet с факторингом подзапроса SQL дает ошибки

Они предлагают изменить sql на следующее как обходной путь.

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

Кто-нибудь знает лучшее универсальное решение, которое не использует настраиваемый sql для любой существующей таблицы, где столбец не имеет определенной точности?

Ответы [ 5 ]

2 голосов
/ 13 августа 2009

Эта ошибка вызвана несовместимостью драйверов Oracle JDBC. Это можно исправить, установив системное свойство oracle.jdbc.J2EE13Compliant в значение true. Например, в командной строке:

java -Doracle.jdbc.J2EE13Compliant=true

1 голос
/ 22 февраля 2011

, если вы используете оракул 10g, и ваши числовые столбцы определены с номером без размера шкалы

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

при заполнении FIELD2 вы получите это исключение.

Проверьте структуру таблицы на наличие числовых полей.

Надеюсь, это поможет вам.

1 голос
/ 14 апреля 2009

В итоге я создал класс ResultSetExctractor, который реализует ResultSetExtractor, и использовал его для получения реализации OracleCachedRowSet SqlRowSet. Чтобы использовать это, вам нужно включить 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 голосов
/ 10 апреля 2009

Попробуйте этот запрос:

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 все еще происходит?

0 голосов
/ 19 марта 2009

Какой Oracle Jar вы используете? Попробуйте перейти на новейшую версию (если вы используете JDK 5 или выше). Я полагаю, что в последнем ojdbc5.jar [или ojdbc6.jar] эта проблема была исправлена ​​- она ​​была вызвана драйверами Oracle, неправильно поддерживающими интерфейс CachedRowSet.

Ссылка для скачивания: Драйверы Oracle JDBC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...