Re: Consulta sobre funcion

Lists: pgsql-es-ayuda
From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Consulta sobre funcion
Date: 2006-06-19 21:50:23
Message-ID: 270a87700606191450t27c2f048qe9e02b22223b2d09@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Estimad(at)s:
Tengo una consulta:
¿un procedimiento, funcion que no retorna valor, permite el uso de
_rollback_ y _commit_ ?

--
Atte.
Daniel Carrero
Analista Programador


From: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-19 22:21:18
Message-ID: 20060619222118.GF7832@mail.interservice.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Mon, Jun 19, 2006 at 05:50:23PM -0400, Daniel Carrero wrote:
> Estimad(at)s:
> Tengo una consulta:
> ¿un procedimiento, funcion que no retorna valor, permite el uso de
> _rollback_ y _commit_ ?

¿Qué quieres decir? ¿Dentro del procedimiento? o ¿Usar el
procedimiento como parte de una transacción?

--
Rodrigo Gallardo
GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Carrero <dxduke(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta sobre funcion
Date: 2006-06-19 22:50:43
Message-ID: 20060619225043.GA26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Carrero escribió:
> Estimad(at)s:
> Tengo una consulta:
> ¿un procedimiento, funcion que no retorna valor, permite el uso de
> _rollback_ y _commit_ ?

No.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 13:21:49
Message-ID: 270a87700606200621i1a97a28at7f59e61124b84951@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 19/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> On Mon, Jun 19, 2006 at 05:50:23PM -0400, Daniel Carrero wrote:
> > Estimad(at)s:
> > Tengo una consulta:
> > ¿un procedimiento, funcion que no retorna valor, permite el uso de
> > _rollback_ y _commit_ ?
>
> ¿Qué quieres decir? ¿Dentro del procedimiento? o ¿Usar el
> procedimiento como parte de una transacción?
>
> --
> Rodrigo Gallardo
> GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.3 (GNU/Linux)
>
> iD8DBQFElyNdAZmDGK3JvCgRAm79AJ0d4kk3lodgwIzgJLLj5qe+NaQZIgCbB2HI
> OfqLhyIxDjhYIJRX2UVyuzQ=
> =8OWs
> -----END PGP SIGNATURE-----
>
>
>

Se supone que dentro de una funcion tengo que hacer INSERT UPDATE o
DELETE, pero, puedo equivocarme, solo se pueden hacer rollback y
commit en procedimientos, esa es la duda. Dentro del procedimiento
hacer un commit o rollback segun se necesite para una transaccion
segura, que en caso de error no ejecute, por ejemplo un insert, se
entiende???
--
Atte.
Daniel Carrero
Analista Programador


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Carrero <dxduke(at)gmail(dot)com>
Cc: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 13:35:03
Message-ID: 20060620133503.GK26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Carrero escribió:

> Se supone que dentro de una funcion tengo que hacer INSERT UPDATE o
> DELETE, pero, puedo equivocarme, solo se pueden hacer rollback y
> commit en procedimientos, esa es la duda. Dentro del procedimiento
> hacer un commit o rollback segun se necesite para una transaccion
> segura, que en caso de error no ejecute, por ejemplo un insert, se
> entiende???

En Postgres no existen "procedimientos", solo funciones. No puedes
hacer un COMMIT ni ROLLBACK dentro de una funcion (tampoco BEGIN). Si
quieres abortar una funcion, haz RAISE EXCEPTION y listo, la funcion
completa esta abortada y la transaccion tambien.

Ahora, puedes capturar excepciones si quieres, o puedes usar SAVEPOINT
antes de entrar a una funcion, pero ese ya es otro tema.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: "Mario Gonzalez" <gonzalemario(at)gmail(dot)com>
To: "Daniel Carrero" <dxduke(at)gmail(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 13:44:08
Message-ID: 2065a6cf0606200644u1a677b38ha56163cbb33d499c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Daniel Carrero escribió:
>
>
> En Postgres no existen "procedimientos", solo funciones. No puedes
> hacer un COMMIT ni ROLLBACK dentro de una funcion (tampoco BEGIN). Si
> quieres abortar una funcion, haz RAISE EXCEPTION y listo, la funcion
> completa esta abortada y la transaccion tambien.
>
> Ahora, puedes capturar excepciones si quieres, o puedes usar SAVEPOINT
> antes de entrar a una funcion, pero ese ya es otro tema.
>

Y usar un SAVEPOINT ayuda un poco en el rendimiento? Creo que lei
una vez que capturar las excepciones puede darle a la funcion un
cierto delay en la ejecucion. Ademas, suena logico.

--
http://www.advogato.org/person/mgonzalez/


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Mario Gonzalez <gonzalemario(at)gmail(dot)com>
Cc: Daniel Carrero <dxduke(at)gmail(dot)com>, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 14:18:30
Message-ID: 20060620141830.GM26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Mario Gonzalez escribió:
> On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> >Daniel Carrero escribió:
> >
> >
> >En Postgres no existen "procedimientos", solo funciones. No puedes
> >hacer un COMMIT ni ROLLBACK dentro de una funcion (tampoco BEGIN). Si
> >quieres abortar una funcion, haz RAISE EXCEPTION y listo, la funcion
> >completa esta abortada y la transaccion tambien.
> >
> >Ahora, puedes capturar excepciones si quieres, o puedes usar SAVEPOINT
> >antes de entrar a una funcion, pero ese ya es otro tema.
>
> Y usar un SAVEPOINT ayuda un poco en el rendimiento? Creo que lei
> una vez que capturar las excepciones puede darle a la funcion un
> cierto delay en la ejecucion. Ademas, suena logico.

Usar un SAVEPOINT tiene un costo mayor que no usarlo. Usar un EXCEPTION
en plpgsql es exactamente el mismo costo, puesto que internamente ambos
usan la misma infraestructura (sub-transacciones). Pero usar un
EXCEPTION o un SAVEPOINT y pagar ese costo, es ciertamente muchisimo mas
barato que abortar la transaccion completa y tener que empezar todo de
nuevo.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


From: "Mario Gonzalez" <gonzalemario(at)gmail(dot)com>
To: "Daniel Carrero" <dxduke(at)gmail(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 14:29:48
Message-ID: 2065a6cf0606200729k3f196e8bxb28bdcf6d8455527@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Mario Gonzalez escribió:
> > On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> > >Daniel Carrero escribió:
> >
> > Y usar un SAVEPOINT ayuda un poco en el rendimiento? Creo que lei
> > una vez que capturar las excepciones puede darle a la funcion un
> > cierto delay en la ejecucion. Ademas, suena logico.
>
> Usar un SAVEPOINT tiene un costo mayor que no usarlo. Usar un EXCEPTION
> en plpgsql es exactamente el mismo costo, puesto que internamente ambos
> usan la misma infraestructura (sub-transacciones). Pero usar un
> EXCEPTION o un SAVEPOINT y pagar ese costo, es ciertamente muchisimo mas
> barato que abortar la transaccion completa y tener que empezar todo de
> nuevo.
>
Ok, entiendo. Thanks!

--
http://www.advogato.org/person/mgonzalez/


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Daniel Carrero" <dxduke(at)gmail(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 15:43:39
Message-ID: 270a87700606200843vc617cf0kadc94eed925dfee@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Daniel Carrero escribió:
>
> > Se supone que dentro de una funcion tengo que hacer INSERT UPDATE o
> > DELETE, pero, puedo equivocarme, solo se pueden hacer rollback y
> > commit en procedimientos, esa es la duda. Dentro del procedimiento
> > hacer un commit o rollback segun se necesite para una transaccion
> > segura, que en caso de error no ejecute, por ejemplo un insert, se
> > entiende???
>
> En Postgres no existen "procedimientos", solo funciones. No puedes
> hacer un COMMIT ni ROLLBACK dentro de una funcion (tampoco BEGIN). Si
> quieres abortar una funcion, haz RAISE EXCEPTION y listo, la funcion
> completa esta abortada y la transaccion tambien.
>
> Ahora, puedes capturar excepciones si quieres, o puedes usar SAVEPOINT
> antes de entrar a una funcion, pero ese ya es otro tema.
>
> --
> Alvaro Herrera http://www.CommandPrompt.com/
> The PostgreSQL Company - Command Prompt, Inc.
>
Y esto que es:

http://www.postgresql.org/docs/8.1/interactive/sql-createfunction.html
en los comentarios ????

--
Atte.
Daniel Carrero
Analista Programador


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Carrero <dxduke(at)gmail(dot)com>
Cc: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 15:58:30
Message-ID: 20060620155830.GQ26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Carrero escribió:

> Y esto que es:
>
> http://www.postgresql.org/docs/8.1/interactive/sql-createfunction.html
> en los comentarios ????

Una funcion que retorna VOID. Puedes tener toda la esperanza que
quieras que es un "procedimiento", pero eso no te permitira usar COMMIT
ni ROLLBACK dentro de el o ella.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Daniel Carrero" <dxduke(at)gmail(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 16:03:54
Message-ID: 270a87700606200903j752033e2t22f0f6edfa3df640@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Daniel Carrero escribió:
>
> > Y esto que es:
> >
> > http://www.postgresql.org/docs/8.1/interactive/sql-createfunction.html
> > en los comentarios ????
>
> Una funcion que retorna VOID. Puedes tener toda la esperanza que
> quieras que es un "procedimiento", pero eso no te permitira usar COMMIT
> ni ROLLBACK dentro de el o ella.
>
> --
> Alvaro Herrera http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>
Ok, entoces nunca se ocupa rollback o commit????
--
Atte.
Daniel Carrero
Analista Programador


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Carrero <dxduke(at)gmail(dot)com>
Cc: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 16:11:33
Message-ID: 20060620161133.GR26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Carrero escribió:
> On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> >Daniel Carrero escribió:
> >
> >> Y esto que es:
> >>
> >> http://www.postgresql.org/docs/8.1/interactive/sql-createfunction.html
> >> en los comentarios ????
> >
> >Una funcion que retorna VOID. Puedes tener toda la esperanza que
> >quieras que es un "procedimiento", pero eso no te permitira usar COMMIT
> >ni ROLLBACK dentro de el o ella.
>
> Ok, entoces nunca se ocupa rollback o commit????

Dentro de una funcion, no.

Intentalo.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Daniel Carrero" <dxduke(at)gmail(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 16:22:44
Message-ID: 270a87700606200922y7485ec55i9fe2f2c33660f46c@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Daniel Carrero escribió:
> > On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> > >Daniel Carrero escribió:
> > >
> > >> Y esto que es:
> > >>
> > >> http://www.postgresql.org/docs/8.1/interactive/sql-createfunction.html
> > >> en los comentarios ????
> > >
> > >Una funcion que retorna VOID. Puedes tener toda la esperanza que
> > >quieras que es un "procedimiento", pero eso no te permitira usar COMMIT
> > >ni ROLLBACK dentro de el o ella.
> >
> > Ok, entoces nunca se ocupa rollback o commit????
>
> Dentro de una funcion, no.
>
> Intentalo.
>
> --
> Alvaro Herrera http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>
Se hace dentro de una transaccion?? por que en una funcion que retorna
un trigger se puede?

--
Atte.
Daniel Carrero
Analista Programador


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Carrero <dxduke(at)gmail(dot)com>
Cc: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 16:47:07
Message-ID: 20060620164707.GU26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Carrero escribió:
> On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:

> >> Ok, entoces nunca se ocupa rollback o commit????
> >
> >Dentro de una funcion, no.
> >
> >Intentalo.
>
> Se hace dentro de una transaccion?? por que en una funcion que retorna
> un trigger se puede?

Que tal si planteas eso de manera que realmente parezca una pregunta que
alguien pueda entender?

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Daniel Carrero" <dxduke(at)gmail(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 18:18:50
Message-ID: 270a87700606201118j5545babemdfc502f3c18e0889@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> Daniel Carrero escribió:
> > On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
>
> > >> Ok, entoces nunca se ocupa rollback o commit????
> > >
> > >Dentro de una funcion, no.
> > >
> > >Intentalo.
> >
> > Se hace dentro de una transaccion?? por que en una funcion que retorna
> > un trigger se puede?
>
> Que tal si planteas eso de manera que realmente parezca una pregunta que
> alguien pueda entender?
>
> --
> Alvaro Herrera http://www.CommandPrompt.com/
> The PostgreSQL Company - Command Prompt, Inc.
>

Ok, lo siento, la cosa es la siguiente.
en el manual de postgresql 8.1 cuando habla de trigger procedures lo
que hace es crear una funcion cierto? y luego desde el trigger se
llama a la funcion con el comando EXECUTE PROCEDURE nombre_funcion();
--> ref --> http://www.postgresql.org/docs/8.1/interactive/plpgsql-trigger.html

si mi ingles no me falla eso es tomado como un procedimiento que se
ejecuta antes o despues de una accion, es lo que hace un trigger.
Por eso pregunto
- dentro de la funcion se tienen INSERT UPDATE o DELETE, ¿¿¿como es
que en una funcion no puede ir entonces ROLLBACK o COMMIT ???
-¿¿ Como me aseguro que el procedimiento haya sido cancelado y vuelva
a su estado anterior la base de datos???

En cuanto a las transacciones:
En un manual de php con postgresql hacen una transaccion directa, es decir:

$sql="BEGIN TRANSACTION ...........";
Donde sí existen COMMIT o ROLLBACK
despues lo ejecutan con pg_exec($con,$sql); (No es una lista de php
pero es para que me entiendan)
Se que esto no es recomendable o no???
Espero no haberme enredado nuevamente
Muchas gracias por toda la ayuda :D
--
Atte.
Daniel Carrero
Analista Programador


From: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 18:35:17
Message-ID: 20060620183517.GG4187@mail.interservice.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Tue, Jun 20, 2006 at 02:18:50PM -0400, Daniel Carrero wrote:
> On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> >Que tal si planteas eso de manera que realmente parezca una pregunta que
> >alguien pueda entender?
> >
>
> Ok, lo siento, la cosa es la siguiente.
> en el manual de postgresql 8.1 cuando habla de trigger procedures lo
> que hace es crear una funcion cierto? y luego desde el trigger se
> llama a la funcion con el comando EXECUTE PROCEDURE nombre_funcion();
> http://www.postgresql.org/docs/8.1/interactive/plpgsql-trigger.html
>
> si mi ingles no me falla eso es tomado como un procedimiento que se
> ejecuta antes o despues de una accion, es lo que hace un trigger.

Hasta aquí, bien. Sólo, olvidate de la distinción
función/procedimiento. En postgres son lo mismo.

> Por eso pregunto
> - dentro de la funcion se tienen INSERT UPDATE o DELETE, ¿¿¿como es
> que en una funcion no puede ir entonces ROLLBACK o COMMIT ???

Porque son cosas diferentes. Una cosa es lo que ejecutas *dentro* de
una transacción, y otra lo que usas para *controlar* la transacción.

> -¿¿ Como me aseguro que el procedimiento haya sido cancelado y vuelva
> a su estado anterior la base de datos???

Me imagino que te refieres al caso en que la función detecta un error,
¿cierto? Fácil: Sí el error lo detectó la misma base de datos (por que
violaste alguna regla de integridad referencial, por ejemplo), la
misma base de datos aborta la transacción. Si el error lo detecta tu
función (digamos que ejecutas una validación de datos y ésta falla),
tu función lanza una excepción y la base de datos, al recibir eso,
aborta la transacción.

> En cuanto a las transacciones:
> En un manual de php con postgresql hacen una transaccion directa, es decir:
>
> $sql="BEGIN TRANSACTION ...........";
> Donde sí existen COMMIT o ROLLBACK
> ...
> Se que esto no es recomendable

¿Por que?
Creo que no estas entendiendo *qué* es una transacción.

--
Rodrigo Gallardo
GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 18:57:08
Message-ID: 270a87700606201157w17d63de3n513a7d666a9e4309@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> On Tue, Jun 20, 2006 at 02:18:50PM -0400, Daniel Carrero wrote:
> > On 20/06/06, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
> > >Que tal si planteas eso de manera que realmente parezca una pregunta que
> > >alguien pueda entender?
> > >
> >
> > Ok, lo siento, la cosa es la siguiente.
> > en el manual de postgresql 8.1 cuando habla de trigger procedures lo
> > que hace es crear una funcion cierto? y luego desde el trigger se
> > llama a la funcion con el comando EXECUTE PROCEDURE nombre_funcion();
> > http://www.postgresql.org/docs/8.1/interactive/plpgsql-trigger.html
> >
> > si mi ingles no me falla eso es tomado como un procedimiento que se
> > ejecuta antes o despues de una accion, es lo que hace un trigger.
>
> Hasta aquí, bien. Sólo, olvidate de la distinción
> función/procedimiento. En postgres son lo mismo.
Hummm.... ?
>
> > Por eso pregunto
> > - dentro de la funcion se tienen INSERT UPDATE o DELETE, ¿¿¿como es
> > que en una funcion no puede ir entonces ROLLBACK o COMMIT ???
>
> Porque son cosas diferentes. Una cosa es lo que ejecutas *dentro* de
> una transacción, y otra lo que usas para *controlar* la transacción.
>
> > -¿¿ Como me aseguro que el procedimiento haya sido cancelado y vuelva
> > a su estado anterior la base de datos???
>
> Me imagino que te refieres al caso en que la función detecta un error,
> ¿cierto? Fácil: Sí el error lo detectó la misma base de datos (por que
> violaste alguna regla de integridad referencial, por ejemplo), la
> misma base de datos aborta la transacción.
>Si el error lo detecta tu
> función (digamos que ejecutas una validación de datos y ésta falla),
> tu función lanza una excepción y la base de datos, al recibir eso,
> aborta la transacción.
Un trigger verdad??
>
> > En cuanto a las transacciones:
> > En un manual de php con postgresql hacen una transaccion directa, es decir:
> >
> > $sql="BEGIN TRANSACTION ...........";
> > Donde sí existen COMMIT o ROLLBACK
> > ...
> > Se que esto no es recomendable
>
> ¿Por que?
> Creo que no estas entendiendo *qué* es una transacción.

http://es.wikipedia.org/wiki/Transacci%C3%B3n
aqui la definicion es clara, entonces una transaccion puede tener
varios bloques definidos por un BEGIN y END, dentro de esta puedo usar
COMMIT o ROLLBACK, la pregunta que ahora me sale es si dentro de una
funcion puedo hacer una transaccion ???
>
> --
> Rodrigo Gallardo
> GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.3 (GNU/Linux)
>
> iD8DBQFEmD/lAZmDGK3JvCgRAvlzAJ402/ewA+DIgjwPb44d1wfIcnYHawCfXPSG
> Oy+OVK4+Qc3/WVZry2VGaEw=
> =bD0G
> -----END PGP SIGNATURE-----
>
>
>

--
Atte.
Daniel Carrero
Analista Programador


From: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 19:26:44
Message-ID: 20060620192644.GH4187@mail.interservice.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Tue, Jun 20, 2006 at 02:57:08PM -0400, Daniel Carrero wrote:
> On 20/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> >Hasta aquí, bien. Sólo, olvidate de la distinción
> >función/procedimiento. En postgres son lo mismo.
> Hummm.... ?

Por alguna razón, muchos lenguajes de programación hacen una
distinción entre 'funciones' y 'funciones que no regresan un
valor'=procedimientos. Tienen reglas acerca de como declarar cada una
y dónde puedes declararlas y donde puedes usarlas. Postgres (y C, y
Lisp, y Java, y Python, y Perl, y ...) no tienen esa distinción. Solo
hay funciones, que regresan 'valores', dónde uno de los 'valores'
posibles es 'void' (Más o menos, pues. Solicito indulgencia a los
puristas del diseño de lenguajes).

¿Ahora sí se entiende?

> >Me imagino que te refieres al caso en que la función detecta un error,
> >¿cierto? Fácil: Sí el error lo detectó la misma base de datos (por que
> >violaste alguna regla de integridad referencial, por ejemplo), la
> >misma base de datos aborta la transacción.
> >Si el error lo detecta tu
> >función (digamos que ejecutas una validación de datos y ésta falla),
> >tu función lanza una excepción y la base de datos, al recibir eso,
> >aborta la transacción.
> Un trigger verdad??

Cualquier función.

> http://es.wikipedia.org/wiki/Transacci%C3%B3n
> aqui la definicion es clara,

> entonces una transaccion puede tener
> varios bloques definidos por un BEGIN y END,

¿Y esto de dónde lo sacas? Una transacción es *un* bloque (delimitado
en SQL por BEGIN - COMMIT/ROLLBACK)

> dentro de esta puedo usar COMMIT o ROLLBACK,

No. El COMMIT/ROLLBACK *delimita* la transacción. Uno cualquiera de
ellos es el 'END'.

> la pregunta que ahora me sale es si dentro de una
> funcion puedo hacer una transaccion ???

Si mal no recuerdo, ya Alvaro dijo *en esta misma hebra* que no.
Lo que puedes hacer es un SAVEPOINT, que viene a ser algo parecido a
una subtransacción.

--
Rodrigo Gallardo
GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28


From: "Daniel Carrero" <dxduke(at)gmail(dot)com>
To: "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 19:50:56
Message-ID: 270a87700606201250x719783d8j58c6e68bdd69c8d6@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 20/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> On Tue, Jun 20, 2006 at 02:57:08PM -0400, Daniel Carrero wrote:
> > On 20/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> > >Hasta aquí, bien. Sólo, olvidate de la distinción
> > >función/procedimiento. En postgres son lo mismo.
> > Hummm.... ?
>
> Por alguna razón, muchos lenguajes de programación hacen una
> distinción entre 'funciones' y 'funciones que no regresan un
> valor'=procedimientos. Tienen reglas acerca de como declarar cada una
> y dónde puedes declararlas y donde puedes usarlas. Postgres (y C, y
> Lisp, y Java, y Python, y Perl, y ...) no tienen esa distinción. Solo
> hay funciones, que regresan 'valores', dónde uno de los 'valores'
> posibles es 'void' (Más o menos, pues. Solicito indulgencia a los
> puristas del diseño de lenguajes).
>
> ¿Ahora sí se entiende?
>
Si ahora si, en realidad sé la diferencia entre funcion y
procedimiento, en pascal lo habia hecho hace años.
> > >Me imagino que te refieres al caso en que la función detecta un error,
> > >¿cierto? Fácil: Sí el error lo detectó la misma base de datos (por que
> > >violaste alguna regla de integridad referencial, por ejemplo), la
> > >misma base de datos aborta la transacción.
> > >Si el error lo detecta tu
> > >función (digamos que ejecutas una validación de datos y ésta falla),
> > >tu función lanza una excepción y la base de datos, al recibir eso,
> > >aborta la transacción.
> > Un trigger verdad??
>
> Cualquier función.
>
> > http://es.wikipedia.org/wiki/Transacci%C3%B3n
> > aqui la definicion es clara,
> Sí
>
> > entonces una transaccion puede tener
> > varios bloques definidos por un BEGIN y END,
>
> ¿Y esto de dónde lo sacas? Una transacción es *un* bloque (delimitado
> en SQL por BEGIN - COMMIT/ROLLBACK)
>
> > dentro de esta puedo usar COMMIT o ROLLBACK,
>
> No. El COMMIT/ROLLBACK *delimita* la transacción. Uno cualquiera de
> ellos es el 'END'.
>
Entonces una funcion tiene varios bloques, delimitados tanto por BEGIN
- END como por BEGIN - ROLLBACK - COMMIT - END
Es asi?
> > la pregunta que ahora me sale es si dentro de una
> > funcion puedo hacer una transaccion ???
>
> Si mal no recuerdo, ya Alvaro dijo *en esta misma hebra* que no.
> Lo que puedes hacer es un SAVEPOINT, que viene a ser algo parecido a
> una subtransacción.

Si es cierto, pero si la respuesta ubiese sido un poco mas documentada
pero bueno, buscare acerca de SAVEPOINT
>
> --
> Rodrigo Gallardo
> GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.3 (GNU/Linux)
>
> iD8DBQFEmEv0AZmDGK3JvCgRAjIgAJ0WYvwUHVf8GyGDY0iWSocAPo7lUACfdQVP
> VdXenBiA8tyoOqFA680kiTI=
> =Tg3f
> -----END PGP SIGNATURE-----
>
>
>

--
Atte.
Daniel Carrero
Analista Programador


From: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 20:14:50
Message-ID: 20060620201450.GI4187@mail.interservice.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Tue, Jun 20, 2006 at 03:50:56PM -0400, Daniel Carrero wrote:
> On 20/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> >No. El COMMIT/ROLLBACK *delimita* la transacción. Uno cualquiera de
> >ellos es el 'END'.
> >
> Entonces una funcion tiene varios bloques, delimitados tanto por BEGIN
> - END como por BEGIN - ROLLBACK - COMMIT - END
> Es asi?

No. Estás confundido por la sintáxis.

Dentro de una función en PL/pgSQL BEGIN-END delimitan bloques
sintácticos. Son las {} de C, pues. Aunque BEGIN se escriba BEGIN, no
tiene *nada* que ver con el BEGIN de SQL. (Por que *no* estás
escribiendo en SQL)

En SQL, BEGIN-COMMIT/ROLLBACK delimitan una transacción. Pero no los
puedes usar dentro de funciones.

--
Rodrigo Gallardo
GPG-Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre funcion
Date: 2006-06-20 21:05:59
Message-ID: 20060620210559.GF26882@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Luis Rodrigo Gallardo Cruz escribió:
> On Tue, Jun 20, 2006 at 03:50:56PM -0400, Daniel Carrero wrote:
> > On 20/06/06, Luis Rodrigo Gallardo Cruz <rodrigo(at)nul-unu(dot)com> wrote:
> > >No. El COMMIT/ROLLBACK *delimita* la transacción. Uno cualquiera de
> > >ellos es el 'END'.
> > >
> > Entonces una funcion tiene varios bloques, delimitados tanto por BEGIN
> > - END como por BEGIN - ROLLBACK - COMMIT - END
> > Es asi?
>
> No. Estás confundido por la sintáxis.
>
> Dentro de una función en PL/pgSQL BEGIN-END delimitan bloques
> sintácticos. Son las {} de C, pues. Aunque BEGIN se escriba BEGIN, no
> tiene *nada* que ver con el BEGIN de SQL. (Por que *no* estás
> escribiendo en SQL)

Ahi estaba la madre del cordero ;-)

Quizas por este motivo, en el estandar SQL se sanciona que la sentencia
para iniciar una transaccion es START TRANSACTION. "BEGIN TRANSACTION"
o "BEGIN WORK" son extensiones de Postgres.

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support