Lamentablemente no. Es un requerimiento de negocio q debo respetar ya q esta impuesto por otro sector. Voy a probar la solución que me decís Mariano y mañana te cuento.

Gracias por su ayuda.

Saludos,

Ignacio

El Apr 6, 2010, a las 19:17, Mariano Reingart <[email protected]> escribió:

Para el to_char:

 INSERT INTO thuban_seq(seq_id) VALUES (to_char(now(),'YYYYMMDD') ||
to_char(id+1,'00000000'))) RETURNING seq_id INTO item_id;

Y para evitar los posibles problemas como recomienda Alvaro (si
entendí bien, que varios usuarios compitan por el mismo ID, que
igualmente te daría error al insertar por ser duplicado), me parece
que tendrías que poner  al principio un:

LOCK TABLE thuban_seq;

lo que bloquearía esta función si hay otro usuario concurrente (y
tendrías que hacerlo al principio de la transacción, posiblemente en
el nivel de aislamiento SERIALIZABLE).

El problema es que bloquearías también cualquier otra operación sob re
la tabla (hasta que termine la transacción), con la probable pérdida
de rendimiento.

¿No podés usar secuencias  automáticas de PostgreSQL (tipo de datos
serial)?, sería más fácil y no tendrías estos problemas.

Sds

Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com


2010/4/6 Ignacio Balcarce <[email protected]>:
Como podría optimizar y mejorar esta función?

Soy nuevo en postgre y realmente me esta costando esto, por donde puedo ver?

Que cambios les harías y porque crees q tengo el error y como lo
corregirías?

Ignacio

El Apr 6, 2010, a las 18:27, Alvaro Herrera <[email protected]>
escribió:

Ignacio Balcarce escribió:

BEGIN
              IF (SELECT max(seq_id) FROM thuban_seq
WHERE seq_id LIKE (to_char(now() + '1 day'::interval,
'YYYYMMDD') || '%')) IS NOT NULL

                             THEN
SELECT max(seq_id) INTO
item_id
                                             FROM thuban_seq
                                             WHERE seq_id LIKE
(to_char(now() + '1 day'::interval, 'YYYYMMDD') || '%');

id := substr (item_id, 9,
length(item_id)-9)::INT8;

              ELSE
                                             id:= 00000000;
              END IF;

INSERT INTO thuban_seq(seq_id) VALUES (to_char(now(),'YYYYMMDD') ||
(id+1)) RETURNING seq_id INTO item_id;


Espero que tengas algún lock externamente a la ejecución de esta
función, porque así como está es sujeto de condiciones de carr era.

--
Alvaro Herrera
http://www.amazon.com/gp/registry/DXLWNGRJD34J
"I'm always right, but sometimes I'm more right than other times."
                                                (Linus Torvalds)

--
TIP 3: Si encontraste la respuesta a tu problema, publ�cala, otros te lo 
agradecer�n

Responder a