Claro, lo que sucede es que yo necesito saber si existe algún id creado ya
para ese dia, por eso es que pregunto que sea del mismo dia el id cuando
llamo ahi.

Aca modifique un poco la función, se ve asi ahora. Pero estoy teniendo
incovenientes con el to_char.

Como se hace para pasar una variable como parámetro de tipo int?

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;
                                               to_char(id, '8');
                                               RAISE NOTICE 'ID SOLAMENTE
CREADO DENTRO DEL IF ES %', id;

                ELSE 
                                               id:= 00000000;
                                               to_char(id, '8');
                                               RAISE NOTICE 'ID SOLAMENTE
CREADO DENTRO DEL ELSE ES %', id;
                END IF;
  
   INSERT INTO thuban_seq(seq_id) VALUES (to_char(now(),'YYYYMMDD') ||
(id+1)) RETURNING seq_id INTO item_id;

   RAISE NOTICE 'EL ID CALCULADO ES %', id;
   
   RETURN item_id;

END;
$$ LANGUAGE plpgsql;

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

2010/4/6 Ignacio Balcarce <[email protected]>:
> 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;
>

Primero, para simplificar, podés hacer el SELECT max(seq_id) INTO id
afuera, y luego el IF id IS NOT NULL (admás, en el IF preguntas  + '1
day'::interval y abajo consultas para el día de hoy, por eso calculo
que no lo encuentra).

Despues, convertí el id con to_char para que conserve los 0 a la izquierda.

Por último, te recomiendo usar los mensajes del servidor de PostgreSQL
para informar el valor calculado (por ej):

RAISE NOTICE 'El ID calculado es %', id;

Así te imprime esos mensajes para facilitar el seguimiento y depuración.

Sds

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

--
TIP 5: ¿Has leído nuestro extenso FAQ?
         http://www.postgresql.org/docs/faqs.FAQ.html

Responder a