Re: Trapping errors

From: Alban Hertroys <dalroi(at)solfertje(dot)student(dot)utwente(dot)nl>
To: Shane W <shane-pgsql(at)csy(dot)ca>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Trapping errors
Date: 2011-05-24 08:38:10
Message-ID: 406C459E-1D85-41AD-807A-E4C2E85A5516@solfertje.student.utwente.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 23 May 2011, at 22:08, Shane W wrote:

> Hello list,
>
> I have a table with double precision columns and update
> queries which multiply and divide these values. I am
> wondering if it's possible to catch overflow and underflow
> errors to set the column to 0 in the case of an underflow
> and a large value in the case of an overflow.
>
> Currently, I have an exception handler in a PLPGSQL
> ufunction that sort of does this.
>
> begin
> update tbl set score = score/s
> exception when numeric_value_out_of range then
> update tbl set score=0
> where cast(score/s as numeric) < 1e-200
> end;
>
> But this is messy since the exception needs to rescan the
> entire table if even one row fails the update. Is there a
> better way to do this?

If you move the overflow/underflow check into a before-trigger, then you can use the NEW.* and OLD.* variables to alter the row before it gets written. That way you scan the table only once and you also moved your handling of such errors into the database (which means that if other applications than your client ever write values to that table, the same rules are applied).

Alban Hertroys

--
Screwing up is an excellent way to attach something to the ceiling.

!DSPAM:737,4ddb6e8111921119526771!

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Alban Hertroys 2011-05-24 08:50:44 Re: strange behaviour in 9.0.2 / ERROR: 22003: value out of range: overflow
Previous Message Adrian Schreyer 2011-05-24 08:29:21 Dumping schemas using pg_dump without extensions (9.1 Beta)