[Pgsql-ayuda] ayuda :)

Alvaro Herrera alvherre@dcc.uchile.cl
Tue, 2 Sep 2003 13:43:27 -0400


On Tue, Sep 02, 2003 at 11:52:59AM -0400, Rodrigo Alvarez wrote:
> >mira si hago un insert  into en una funcion a una tabla determinada, si me 
> >resulta un error , por darte un ejemplo, la clave primaria ya exista.. 
> >como puedo recuperar ese error como para poder hacer algun manejo simple 
> >de errores...
> 
> [este parrafo lo escribi yo en un mail privado:]
>
> Depende del lenguaje que estes usando para conectarte a la BD,
> obviamente.
> 
> el lenguaje que estoy utilizando es plpgsql

Hmmm... el problema es que si intentas insertar un valor que ya existe,
el sistema arroja un error _y_ aborta la transaccion en curso.  No hay
manera de volver a un estado valido, como no sea cancelando la
transaccion en curso ("ROLLBACK") y luego intentarlo todo desde el
principio.

Este es un problema bastante recurrente y que no tiene una solucion
satisfactoria IMHO.  Habia un parche con el cual se lograba disminuir la
probabilidad de una condicion de carrera ("race condition"), pero ésta
sigue existiendo :-(   La idea era usar INSERT ... SELECT ... EXCEPT, no
recuerdo los detalles.

La verdadera solucion seria usar un sistema de transacciones anidadas, o
savepoints.  Ojalá eso se pueda tener para 7.5!

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"No hay ausente sin culpa ni presente sin disculpa" (Prov. frances)