Barbaro, ahora me cierra un poco mas. Gracias por tu ayuda. El script quedo
de esta manera:

CREATE OR REPLACE FUNCTION THUBAN_SP_GENERATEID() RETURNS VARCHAR
AS $$
DECLARE
   item_id   VARCHAR;
   id        INT8;
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;
   
   RETURN item_id;

END;
$$ LANGUAGE plpgsql;

Te hago una consulta, al ejecutar la función de esta manera 

SELECT THUBAN_SP_GENERATEID();

Me genero el primer id de este modo

"201004061" pero yo lo necesito de este "20100406000000001"

El siguiente inconveniente es que cuando nuevamente volvi a ejecutar 

SELECT THUBAN_SP_GENERATEID();

Obtuve el siguiente error

ERROR:  llave duplicada viola restricción de unicidad «pk_thuban_seq»
CONTEXT:  sentencia SQL: «INSERT INTO thuban_seq(seq_id) VALUES
(to_char(now(),'YYYYMMDD') || ( $1 +1)) RETURNING seq_id»
PL/pgSQL function "thuban_sp_generateid" line 19 at sentencia SQL

********** Error **********

ERROR: llave duplicada viola restricción de unicidad «pk_thuban_seq»
SQL state: 23505
Context: sentencia SQL: «INSERT INTO thuban_seq(seq_id) VALUES
(to_char(now(),'YYYYMMDD') || ( $1 +1)) RETURNING seq_id»
PL/pgSQL function "thuban_sp_generateid" line 19 at sentencia SQL.

Calculo que debe ser porque no debe estar generando bien los ids y los busca
de otra manera, aunque debería de poder tomar el 1 aunque sea, no?


Saludos,




-----Mensaje original-----
De: Mariano Reingart [mailto:[email protected]] 
Enviado el: Martes, 06 de Abril de 2010 04:06 p.m.
Para: Ignacio Balcarce
CC: [email protected]
Asunto: Re: [pgsql-es-ayuda] MSSQL to PostgreSQL - Problema intentando
generar ID de modo YYYYMMDD0000000X

On Tue, Apr 6, 2010 at 3:31 PM, Mariano Reingart <[email protected]> wrote:
> On Tue, Apr 6, 2010 at 10:08 AM, Ignacio Balcarce
> <[email protected]> wrote:
>
>> ERROR:  el valor null para la columna «seq_id» viola la restricción not
null
>>
>> CONTEXT:  sentencia SQL: «INSERT INTO thuban_seq(seq_id) VALUES
>> (to_char(now(),'YYYYMMDD') || ( $1 +1)) RETURNING seq_id»
>>
>> PL/pgSQL function "thuban_sp_generateid" line 19 at sentencia SQL
>>
>
> ¿Por que $1 si la función no tiene parámetros?
> Si entiendo bien, te esta convirtiendo todo a NULL por este parámetro.
> ¿No podés usar la variable id que estás calculando?
>

Perdón, no había visto bien la función, el problema esta en el IF,
siempre es verdadero (aún cuando no tenés datos), calculo que tendrías
que reescribirlo a:

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

El EXISTS y COALESCE no ayudan en tu caso como lo planteaste (y todo
se convierte en NULL).

Sds

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

--
TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
               http://archives.postgresql.org/pgsql-es-ayuda

Responder a