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