Re: Personalizar Mensajes de Exceptions

From: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
To: Sergio David <mr(dot)sdf88(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Personalizar Mensajes de Exceptions
Date: 2009-09-17 14:51:17
Message-ID: b623c7e40909170751q68980af9t3f908b55338c84ed@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2009/9/16 Sergio David <mr(dot)sdf88(at)gmail(dot)com>

> Hola gente de la lista...
>
> Estoy llevando a cabo un proyecto, y realizando la parte de logica de
> negocios a nivel de base de datos...
>
> Encontre que PostgreSQL tiene la posibilidad de capturar errores dentro de
> las funciones, al mejor estilo try... catch...
>
> El problema que tengo ahora es que quiero personalizar los errores... Tengo
> la siguiente estructura...
>
> [CODE]
> CREATE TABLE instituciones
> (
> ins_codinst serial NOT NULL,
> ins_tipoinst character varying(10) NOT NULL,
> ins_nombre character varying(30) NOT NULL,
> CONSTRAINT pk_instituciones PRIMARY KEY (ins_codinst)
> )
> [/CODE]
>
> y la siguiente funcion para realizar los ABM (CUD) a dicha tabla..
>
> [CODE]
> CREATE OR REPLACE FUNCTION abm_instituciones(bpchar, integer, character
> varying, character varying)
> RETURNS void AS
> $BODY$
> DECLARE
> in_action ALIAS FOR $1;
> in_id ALIAS FOR $2;
> in_inst_nombre ALIAS FOR $3;
> in_tipoinst ALIAS FOR $4;
>
> BEGIN
> IF in_action = 'S' THEN
> -- if id is null, save it... otherwise... update it
> IF ((select count(*) from dominios where dom_coddompadre = 'O.TI' and
> dom_coddom = upper(trim(in_tipoinst))) = 0) THEN
> RAISE EXCEPTION 'El codigo % no corresponde a un tipo de
> institución', upper(trim(in_tipoinst));
> END IF;
> IF in_id IS NULL THEN
> INSERT INTO instituciones (ins_codinst, ins_tipoinst, ins_nombre)
> VALUES
> (nextval('instituciones_ins_codinst_seq'),
> upper(trim(in_tipoinst)), upper(trim(in_inst_nombre)));
> ELSE
> UPDATE instituciones SET
> ins_tipoinst = upper(trim(in_tipoinst)),
> ins_nombre = upper(trim(in_inst_nombre))
> WHERE ins_codinst = in_id;
> END IF;
> ELSE
> DELETE FROM instituciones
> WHERE ins_codinst = in_id;
> END IF;
>
> -- Catch errors if any
> EXCEPTION
> WHEN not_null_violation THEN
> RAISE EXCEPTION 'Todos los campos son requeridos';
> WHEN foreign_key_violation THEN
> RAISE EXCEPTION 'La institución no puede ser borrada, existen
> dependencias para este registro.';
> WHEN string_data_right_truncation THEN
> RAISE EXCEPTION 'Se ha superado el maximo de caracteres
> permitidos.';
> WHEN unique_violation THEN
> RAISE EXCEPTION 'La institución % ya existe en la base de datos.',
> upper(trim(in_inst_nombre));
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE;
> [/CODE]
>
> Todo bien hasta aca, captura todos los errores marcados despues del
> EXCEPTION.
>
> Lo que yo quiero saber es si es posible capturar la columna que disparo el
> error. Supongamos que se supero el maximo de caracteres de la columna
> nombre, entonces mostrar un mensaje de que es esa columna la que esta
> causando conflicto... o Si es que esta en null, marcar cual columna es que
> quedo en null...
>
> Porque de la manera en que esta planteado ahora, los mensajes son muy
> genericos, supongamos que tengo 20 columnas NOT NULL... Como puedo hacer
> saber al usuario cual de esas columnas fue la que genero el error...
>
> Se entiende? Hay forma de hacerlo?
>
> Espero respuesta... Muchas Gracias...
>

Yo hizo algo asi, pero lo tuve que hacer en la aplicación cliente. En python
leida la cadena error generica de postgresql y con split la divido y saco
los datos.

Cuando pregunte algo parecido, me comento Alvaro que se tiene internamente
todos los datos, pero no son accesibles desde pl/pgsql.

--
________________________________________
Lo bueno de vivir un dia mas
es saber que nos queda un dia menos de vida

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Emanuel Calvo Franco 2009-09-17 15:07:19 Fwd: Algun framework bueno para postgresql
Previous Message Sergio Gabriel Rodriguez 2009-09-17 14:21:12 Re: GRANT SELECT para todas las tablas de una base