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

Personalizar Mensajes de Exceptions

From: Sergio David <mr(dot)sdf88(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Personalizar Mensajes de Exceptions
Date: 2009-09-16 16:39:10
Message-ID: c07a0b5d0909160939w749146d2oa0cd84ae752892cc@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
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...

Responses

pgsql-es-ayuda by date

Next:From: gilberto.castilloDate: 2009-09-16 16:44:23
Subject: Re: [OT] Amigos cubanos
Previous:From: Emanuel Calvo FrancoDate: 2009-09-16 15:32:05
Subject: Re: Algun framework bueno para postgresql

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