2009/9/16 Sergio David <mr.sd...@gmail.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

Reply via email to