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: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X
Date: 2010-04-06 19:59:42
Message-ID: 000501cad5c3$b37e0540$1a7a0fc0$@balcarce@vivatia.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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:reingart(at)gmail(dot)com]
Enviado el: Martes, 06 de Abril de 2010 04:43 p.m.
Para: Ignacio Balcarce
CC: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] MSSQL to PostgreSQL - Problema intentando
generar ID de modo YYYYMMDD0000000X

2010/4/6 Ignacio Balcarce <ignacio(dot)balcarce(at)vivatia(dot)com>:
> 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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2010-04-06 20:00:54 Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Es posible recuperar una base de datos después de hacer "drop database"?
Previous Message Mariano Reingart 2010-04-06 19:42:36 Re: MSSQL to PostgreSQL - Problema intentando generar ID de modo YYYYMMDD0000000X