как выяснить причину автоматического округления десятичного значения в таблицы оракула, имеющие номер типа данных (без масштаба, без точности) - PullRequest
0 голосов
/ 26 декабря 2018

Я работаю над проектом, который разрабатывался на более ранней версии Java ниже 1.7 и Oracle 11 в качестве базы данных.
В этом я сталкиваюсь со странной проблемой автоматического округления десятичных значений.Проблема в том, что десятичные значения вычисляются правильно в Java-коде и сохраняются в переменную с двойным типом данных.Кроме того, таблица базы данных, в которую вставляются значения, содержит номер типа данных без какой-либо точности или масштаба.При вставке вычисленных выше значений через подготовленный пакет операторов иногда автоматически округляется, а иногда работает нормально.Это периодически возникающая проблема.

Ниже приведен код метода вставки, в котором происходит вставка с использованием драйвера jdbc,

PreparedStatement ps = ConnectionPool.getStatement(TrafficDAO.class
        .getName(), threadId, key);
    try {
        // if not cached prepare batched statement and cache it
        if (ps == null) {
            String query = StatementGenerator.getInsertStatement(model,
                !directInsert, isDirectLoadingEnabled);
            ps = connection.prepareStatement(query);
            ConnectionPool.addStatement(TrafficDAO.class.getName(),
                threadId, key, ps);
        }
        ps.clearBatch();

        ColumnModel[] columnModels = model.getColumnModels();

        HashSet<String> nullCols = new HashSet<String>();;
        int nullRowCount = 0;
        // add rows to batch
        for (int j = startRow; j < endRow; j++) {
            Object[] nextRow = rowsToBeInserted.get(j);
            boolean nullInRow = false;
            for (int i = 0; i < columnModels.length; i++) {
                Object value = nextRow[i];
                columnModels[i].write(value, i + 1, ps);
            }
            ps.addBatch();
        }


        // execute insert
        int[] result = null;
        String task = opt ? INSERT_OPT_TASK : INSERT_TASK;
        try {
            Profiler.startTask(task , taskID);

            result = ps.executeBatch();
        } finally {
            Profiler.stopTask(task , taskID);
        }


/** write method */
public void write(Object value, int idx, PreparedStatement ps)
    throws SQLException
{
    if (value == null || (value instanceof Double && ((Double)value).isNaN()))
        ps.setNull(idx, Types.DOUBLE);
    else
        // if we get an empty string for a number this is also null
        if(value instanceof String && ((String)value).length() == 0){
             ps.setNull(idx, Types.DOUBLE);
        }else{
             ps.setDouble(idx, convert(value));
        }  

Не удалось найти причину этой проблемы, пожалуйста, предложите.

Пожалуйста, спросите, если вам нужно больше информации.

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