Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group