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...
Código:
y la siguiente funcion para realizar los ABM (CUD) a dicha tabla..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) )
Código:
Todo bien hasta aca, captura todos los errores marcados despues del EXCEPTION.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;
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...