Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X

From: Ignacio Balcarce <ignacio(dot)balcarce(at)vivatia(dot)com>
To: Mariano Reingart <reingart(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X
Date: 2010-04-07 01:32:15
Message-ID: 7C0B7E28-615D-4AAB-8AF9-364B8B5646F5@vivatia.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 <reingart(at)gmail(dot)com>
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 <ignacio(dot)balcarce(at)vivatia(dot)com>:
>> 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 <alvherre(at)alvh(dot)no-ip(dot)org>
>> 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)
>>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jose Alberto Sanchez Nieto 2010-04-07 09:17:00 duda en la realizacion de una consulta
Previous Message Ignacio Balcarce 2010-04-06 23:32:33 Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X