RE: Personalizar SQLERRM

From: Pedro PG <pedropg(at)outlook(dot)com>
To: Jaime Casanova <jaime(at)2ndquadrant(dot)com>, Jorge Medina <jorge(at)bsdchile(dot)cl>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Personalizar SQLERRM
Date: 2014-02-06 15:50:34
Message-ID: BLU180-W3DBDA11BFFC9822E90E08A7940@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Lista, buen día, al final me fue de utilidad el uso de "GET STACKED DIAGNOSTICS", les comento mi escenario:
Tengo una tabla tb_exception en donde almaceno todos los errores que ocurren en la BD, esta tabla tiene como estructura los campos que retorna GET STACKED DIAGNOSTICS (RETURNED_SQLSTATE, COLUMN_NAME, CONSTRAINT_NAME, etcétera); tengo dos tablas con el típico Maestro --< Detalle, para cada tabla tengo una función que realiza operaciones (inserta, actualiza, elimina, etc).
Ahora en el bloque EXCEPTION de cada función capturo el error con GET STACKED DIAGNOSTICS de la siguiente forma:
BEGIN /* instrucciones */EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS ...; INSERT INTO tb_excepcion (...) values (RETURNED_SQLSTATE, COLUMN_NAME, ...etc);END;
Dentro de la FUNCION_MAESTRO se insertan cuantos detalle tenga para lo cual se llama a la funcion FUNCION_DETALLE:
BEGIN /* instrucciones */ /* bucle inserta en detalle */ select FUNCTION_DETALLE(....) into variable; if variable = -1 then /* AQUI ES MI PROBLEMA */ RAISE EXCEPTION USING MESSAGE = row.message, DETAIL = row.detail, COLUMN = row.column, CONSTRAINT = row.constraint, DATATYPE = row.datatype, TABLE = row.table, SCHEMA = row.schema; end if; /* final bucle inserta en detalle */EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS ...; INSERT INTO tb_excepcion (...) values (RETURNED_SQLSTATE, COLUMN_NAME, ...etc);END;
El problema es: Cuando el error ocurre al nivel de la tabla MAESTRO el error se registra correctamente en la tabla tb_exception, sin embargo cuando el error ocurre a nivel de la tabla DETALLE el error se registra en la tabla tb_exception pero con las columnas vacias; en otras palabras, se esta ejecutando el bloque EXCEPTION de la funcion MAESTRO y no la de DETALLE.
Como puedo solucionar esto, espero haberme explicado bien.Gracias por su tiempo.From: pedropg(at)outlook(dot)com
To: jaime(at)2ndquadrant(dot)com; jorge(at)bsdchile(dot)cl
CC: pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: [pgsql-es-ayuda] Personalizar SQLERRM
Date: Wed, 5 Feb 2014 12:43:24 -0500

Muchas gracias, con GET STACKED DIAGNOSTICS solucione mi problema.Saludos.

> From: jaime(at)2ndquadrant(dot)com
> Date: Sat, 1 Feb 2014 12:34:00 -0500
> Subject: Re: [pgsql-es-ayuda] Personalizar SQLERRM
> To: jorge(at)bsdchile(dot)cl
> CC: pedropg(at)outlook(dot)com; pgsql-es-ayuda(at)postgresql(dot)org
>
> 2014-02-01 Jorge Medina <jorge(at)bsdchile(dot)cl>:
> >
> > 2014-02-01 Jaime Casanova <jaime(at)2ndquadrant(dot)com>
> >
> >> 2014-01-31 Pedro PG <pedropg(at)outlook(dot)com>:
> >> >
> >> > llave duplicada viola restricción de unicidad «cuk__venta___comprobante»
> >> >
> >> > Lo que deseo saber es: como es que se arma este mensaje, de que tabla
> >> > saca
> >> > el texto llave duplicada viola restricción de unicidad,
> >>
> >> Saludos,
> >>
> >> El mensaje no sale de una tabla sino que esta en el código fuente de
> >> PostgreSQL:
> >> el mensaje original está en src/backend/access/nbtree/nbtinsert.c
> >> (línea 392) y la traducción al español en src/backend/po/es.po (línea
> >> 467)
> >>
> >> > debo hacer una
> >> > función que registre al detalle las excepciones.
> >> >
> >> > PD: No deseo personalizar el mensaje con la instrucción:
> >> >
> >> > RAISE EXCEPTION USING ERRCODE = "etc", MESSAGE = "etc";
> >> >
> >>
> >> por que?
> >
> >
> > no es por nada, pero entiendo que «cuk__venta___comprobante» es el nombre de
> > una constrain que afecta a dos tablas específicamente y ahí ya tienes tu
> > información.
> >
>
> pero no puedes basar tu decision en el nombre del constraint por que
> tu puedes darle al constraint un nombre no relacionado.
>
> Chequeando un poco mas, veo que desde 9.2 existe GET STACKED
> DIAGNOSTICS que te permite sacar información sobre el mensaje de
> error, la tabla y otros datos.
> http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-EXCEPTION-DIAGNOSTICS-VALUES
>
> --
> Jaime Casanova www.2ndQuadrant.com
> Professional PostgreSQL: Soporte 24x7 y capacitación
> Phone: +593 4 5107566 Cell: +593 987171157
>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Luz María García Reyna 2014-02-06 19:45:10 Problema con clausula OVER
Previous Message Jorge Tornero 2014-02-06 08:19:38 Tablas cruzadas en PostgreSQL