Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Personalizar Errores (Exceptions) con plpgsql

Estas en el tema de Personalizar Errores (Exceptions) con plpgsql en el foro de PostgreSQL en Foros del Web. Hola gente del foro... Estoy llevando a cabo un proyecto, y realizando la parte de logica de negocios a nivel de base de datos... Encontre ...
  #1 (permalink)  
Antiguo 16/09/2009, 09:25
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Pregunta Personalizar Errores (Exceptions) con plpgsql

Hola gente del foro...

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:
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)
)
y la siguiente funcion para realizar los ABM (CUD) a dicha tabla..

Código:
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;
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...
__________________
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
  #2 (permalink)  
Antiguo 16/09/2009, 09:50
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Personalizar Errores (Exceptions) con plpgsql

Si se entiende. Pero la verdad no se si se pueda.
Mira esto:
http://www.postgresql.org/docs/8.2/s...-messages.html

y trata de utilizar en vez de exception, errores mas concretos. Puedes probar con info o debug para ver si te da errores mas exactos.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 16/09/2009, 10:32
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: Personalizar Errores (Exceptions) con plpgsql

De hecho que se podria hacer una verificacion un raise por cada campo, pero me gustaria utilizar las herramientas ya disponibles para tal fin...

Haciendo un pensamiento rapido, creo que ni con los lenguajes de 3ra generación es tan facil...

De igual manera seguiré investigando, o si alguien ya lo ha hecho... que lo postee...

Salu2.
__________________
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:08.