2015-11-12 2 views
1

У меня есть таблица в PostgreSQL (mixbest) с 73018 строками. Поля, которые я хочу, чтобы выбрать являются:PostgreSQL: SQLstate: 22003 числовое переполнение

sample integer 
m  integer, 
pciv double precision, 
aggrec double precision 
soil character(1) 

Я пытаюсь ОТБОРНЫМ, но я получаю следующее сообщение об ошибке: SQLSTATE 22003 числового переполнении. Мой выбор:

SELECT sample, m, 1-(EXP(SUM(LN(1-pciv)))) pciv, avg (aggrec) aggrec_avg, soil 
FROM mixbest 
GROUP BY sample, m, soil; 

Я знаю, что проблема заключается в EXP() из-за я попробовал то же выбрать с выражением (SUM (LN (1-pciv)))) и я не получаю такая же ошибка.

Я попытался выполнить команду выбрать только в несколько строк, и она работает:

SELECT sample, m, 1-(EXP(SUM(LN(1-pciv)))) pciv, avg (aggrec) aggrec_avg, soil 
FROM mixbest 
WHERE sample< 4492 GROUP BY sample, m, soil; 

Есть ли у вас какие-либо предложения?

+0

Не могли бы вы показать, что 'выбрать макс (pciv) из (SELECT образца, м, SUM (LN (1-pciv)) pciv, Avg (aggrec) aggrec_avg , почва FROM mixbest GROUP BY образец, м, почва) t; 'дает? –

+0

Несомненно, результат 'select max (pciv) from (SELECT sample, m, SUM (LN (1-pciv)) pciv, avg (aggrec) aggrec_avg, почва FROM mixbest GROUP BY sample, m, почва) t;' is -16.1561356371564 –

+0

Ok, отрицательные числа, теперь вы можете показать результат 'select min (pciv) from (SELECT sample, m, SUM (LN (1-pciv)) pciv, avg (aggrec) aggrec_avg, почва FROM mixbest GROUP По образцу, м, почве) t; –

ответ

1

Что-то вроде этого, я думаю:

create or replace function mixbest_avg(out sample int, out m int, out pciv double precision, out aggrec_avg double precision, out soil character(1)) 
    returns setof record as 
$$ 
declare 
    rec record; 
begin 
    for rec in 
     SELECT t.sample _sample, t.m _m, SUM(LN(1-t.pciv)) _pciv, avg(t.aggrec) _aggrec, t.soil _soil 
      FROM mixbest t 
      GROUP BY t.sample, t.m, t.soil 
    loop 
     begin 
      rec._pciv = 1 - exp(rec._pciv); 
     exception 
      when numeric_value_out_of_range then -- here we catch an exception 
       rec._pciv = 0; -- or other default value 
     end; 

     select rec._sample, rec._m, rec._pciv, rec._aggrec, rec._soil into sample, m, pciv, aggrec_avg, soil; 
     return next; 
    end loop; 
end 
$$ language plpgsql;