Re: FW: [pgsql-es-ayuda] Un poco perdido creando una función.

From: Pablo Braulio <brulics(at)gmail(dot)com>
To: Daniel Orozco Jaramillo <daniel_orozco_jaramillo(at)hotmail(dot)com>
Cc: postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: FW: [pgsql-es-ayuda] Un poco perdido creando una función.
Date: 2007-12-19 15:17:00
Message-ID: 476935EC.9040108@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Daniel Orozco Jaramillo escribió:
> Miento.... no se cae.... en ninguna situación.
>
>
>
> ------------------------------------------------------------------------
> From: daniel_orozco_jaramillo(at)hotmail(dot)com
> To: pgsql-es-ayuda(at)postgresql(dot)org
> Subject: FW: [pgsql-es-ayuda] Un poco perdido creando una función.
> Date: Wed, 19 Dec 2007 13:52:13 +0000
>
> Para q te devuelva el id actual (el q se acaba de insertar) tienes q
> hacer 2 pequeños cambios:
>
> 1. Añadir un campo a la tabla llamado fecha_hora (alter table
> estudio add column fecha_hora timestamp;)
>
> 2. correr la función de la siguiente forma:
> create or replace function insertestudio(text) returns integer as $$
> declare
> nombestudio ALIAS FOR $1;
> rec record;
> fec timestamp;
> /*idestudio int4;
> idoferta int4;*/
> begin
> fec := current_timestamp;
> insert into estudio(nombre,fecha_hora) values(nombestudio,fec);
> select into rec id from estudio where nombre = nombestudio and
> fecha_hora = fec;
> return rec.id;
> end;
> $$ language plpgsql;
>
> Espero te sirva de ayuda.
>

Pues si, me gusta. Muchas gracias.

El caso que he puesto es en el supuesto de hacer un pequeño insert (pues
sólo se hace con un campo), pero tengo el caso de hacer un insert sin
usar ninguna función. Me explico.

En el programa que estoy haciendo, cuando se hace un insert (recogiendo
los datos de un formulario), este muestra los datos introducidos al
acabar el insert.

Para ello, ejecuta el insert, selecciona la última fila de la tabla
(usando select max(campo)) y luego hace un select usando el valor del
campo de la última fila.

Esto me obliga a ejecutar dos sentencias, conllevando a un posible error
si dos usuarios ejecutan lo mismo a la vez (esto ya lo he comentado).

He visto el modo de substituir el "select max(campo) from tabla..." por
un select currval('public.tabla_camop_seq'), que me devuelve el valor
actual de la secuencia. Esto no soluciona totalmente el "pequeño"
inconveniente del posible error en caso de coincidencia de insert.

Lo que considero mas adecuado sería crear una función que devolviera un
trigger (after insert) que devolviera el valor de "select currval(...)"
tras ejecutar el insert. De ese modo no tendría que declarar dos querys
en mi programa y reduciría la posibilidad de error. El problema como
siempre es el declarar la función.

create or replace function insertestudioauto() returns trigger as $$
declare
valor record;
begin
select into valor currval('public.estudio_id_seq');
return valor;
end;
$$ language plpgsql;

create trigger insertestudioauto after insert on estudio for each row
execute procedure insertestudioauto();

Esto se ejecuta correctamente, pero al hacer un insert:

INSERT INTO estudio(nombre) values('probandoooooooooo');
ERROR: returned tuple structure does not match table of trigger event
CONTEXT: PL/pgSQL function "insertestudioauto" line 3 at block
variables initialization

¿Alguna idea?.
- --

< ¡¡Nos vemos!! >
----------------------------
\
\
.::!!!!!!!:.
.!!!!!:. .:!!!!!!!!!!!!
~~~~!!!!!!. .:!!!!!!!!!UWWW$$$
:$$NWX!!: .:!!!!!!XUWW$$$$$$$$$P
$$$$$##WX!: .<!!!!UW$$$$" $$$$$$$$#
$$$$$ $$$UX :!!UW$$$$$$$$$ 4$$$$$*
^$$$B $$$$\ $$$$$$$$$$$$ d$$R"
"*$bd$$$$ '*$$$$$$$$$$$o+#"
"""" """""""
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFHaTXsK7lGsMchFswRAk4BAKCZRxA8xAumo96SDubRT7iZeb5SVgCdEDeP
I+yZ3TqoMok3YFpeQsiaUDw=
=Mznk
-----END PGP SIGNATURE-----

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Rodríguez Penabad 2007-12-19 15:35:59 Re: Re: FW: [pgsql-es-ayuda] Un poco perdido creando una función.
Previous Message Maseguri5 2007-12-19 14:57:13 Re: [pgsql-es-ayuda] Pasajes a producción de aplicaciones en Postgresql