Re: Commit en PLPGSQL

Lists: pgsql-es-ayuda
From: Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Commit en PLPGSQL
Date: 2007-06-05 15:34:34
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Buenas a todos,
tengo una duda sobre la cuál ustedes me puedan ayudar.
Según he leído todo el código PL/PGSQL ejecutado en una función queda
englobado de forma automática en una sóla transacción.
Pues bien, he codificado una función que realiza el proceso de migración
de una tabla con los datos en bruto (sin normalizar, sin FK, etc) a
otras tablas que forman parte de mi esquema normalizado. A lo largo del
proceso de transformación y carga de datos pueden surgir ciertos errores
pero en ningún momento quisiera perder todos los registros procesados
hasta ese momento. Recuerdo que en Oracle se podían incluir
COMMIT/ROLLBACK en cualquier punto del procedimiento almacenado.

¿Cómo podría codificar mis funciones almacenadas para conseguir este
resultado?

Muchas gracias de antemano.


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Commit en PLPGSQL
Date: 2007-06-05 15:49:43
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Jose Maria Mencia Fernandez escribió:

> Pues bien, he codificado una función que realiza el proceso de migración
> de una tabla con los datos en bruto (sin normalizar, sin FK, etc) a
> otras tablas que forman parte de mi esquema normalizado. A lo largo del
> proceso de transformación y carga de datos pueden surgir ciertos errores
> pero en ningún momento quisiera perder todos los registros procesados
> hasta ese momento.

Usa bloques EXCEPTION.

--
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34J
<inflex> really, I see PHP as like a strange amalgamation of C, Perl, Shell
<crab> inflex: you know that "amalgam" means "mixture with mercury",
more or less, right?
<crab> i.e., "deadly poison"


From: "Mario Gonzalez" <gonzalemario(at)gmail(dot)com>
To: "Jose Maria Mencia Fernandez" <jmencia(at)alimarket(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Commit en PLPGSQL
Date: 2007-06-05 15:53:50
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 05/06/07, Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es> wrote:
>
> ¿Cómo podría codificar mis funciones almacenadas para conseguir este
> resultado?
>

Ciertamente no puedes hacer un ROLLBACK ni COMMIT dentro de una
funcion, pero si lo que quieres es detectar algun error pudieras
probar la clausula EXCEPTION la cual usa internamente un SAVEPOINT
http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

Creo que lo mejor es que no solo tengas una funcion, mas bien varias
y que ejecuten una accion especifica. Asi sabras que fue lo que fallo
y desde ahi decidir que hacer.

Es similar a la filosofia UNIX: mejor tener hartos programas que
hagan cosas especificas que tener un programa gigante que haga todo.

>

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


From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Jose Maria Mencia Fernandez" <jmencia(at)alimarket(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Commit en PLPGSQL
Date: 2007-06-06 04:44:13
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 6/5/07, Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es> wrote:
> Según he leído todo el código PL/PGSQL ejecutado en una función queda
> englobado de forma automática en una sóla transacción.
> Pues bien, he codificado una función que realiza el proceso de migración
> de una tabla con los datos en bruto (sin normalizar, sin FK, etc) a
> otras tablas que forman parte de mi esquema normalizado.

tienes un problema que no tendrias si usaras cada herramienta para lo
que sirve... despues de todo, porque usar un "procedimiento
almacenado" para eso? para eso deberias hacer un script en algun
lenguaje mas apropiado...

--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook


From: Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es>
To: Jaime Casanova <systemguards(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Commit en PLPGSQL
Date: 2007-06-06 07:04:51
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

> On 6/5/07, Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es> wrote:
> > Según he leído todo el código PL/PGSQL ejecutado en una función queda
> > englobado de forma automática en una sóla transacción.
> > Pues bien, he codificado una función que realiza el proceso de migración
> > de una tabla con los datos en bruto (sin normalizar, sin FK, etc) a
> > otras tablas que forman parte de mi esquema normalizado.
>
> tienes un problema que no tendrias si usaras cada herramienta para lo
> que sirve... despues de todo, porque usar un "procedimiento
> almacenado" para eso? para eso deberias hacer un script en algun
> lenguaje mas apropiado...
>
Gracias por el consejo, Jaime, pero no es esa la cuestión que he
planteado a la lista. No conoces el entorno en el que trabajo para
deducir que sería más apropiado un script en otro lenguaje que esta
solución.
Te agradezco la respuesta en todo caso.


From: Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es>
To: Mario Gonzalez <gonzalemario(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Commit en PLPGSQL
Date: 2007-06-06 07:08:01
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

> Ciertamente no puedes hacer un ROLLBACK ni COMMIT dentro de una
> funcion, pero si lo que quieres es detectar algun error pudieras
> probar la clausula EXCEPTION la cual usa internamente un SAVEPOINT
> http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
>
No sabía lo del SAVEPOINT con la cláusula EXCEPTION, gracias por
puntualizarlo.

> Creo que lo mejor es que no solo tengas una funcion, mas bien varias
> y que ejecuten una accion especifica. Asi sabras que fue lo que fallo
> y desde ahi decidir que hacer.
Tienes razón. Había pensado en ello pero por avanzar he escrito el
código en una sóla. Es razonable dividirla ...


From: "Mario Gonzalez" <gonzalemario(at)gmail(dot)com>
To: "Jose Maria Mencia Fernandez" <jmencia(at)alimarket(dot)es>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Commit en PLPGSQL
Date: 2007-06-06 12:37:18
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 06/06/07, Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es> wrote:
> >
> No sabía lo del SAVEPOINT con la cláusula EXCEPTION, gracias por
> puntualizarlo.
>

Solo una aclaracion, el SAVEPOINT es transparente para el
programador, tu solo usas el EXCEPTION y al compilar tu codigo,
digamos... postgres lo transforma a un SAVEPOINT.

>

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