Que sabes de GNU/Linux?

martes, 8 de diciembre de 2009

Postgresql - Actualizar tablas de forma dinámica la estructura es de tablas de relleno

-- Function: sdd_execute_idu_relleno(character varying, integer, character varying, character varying, integer, smallint)

-- DROP FUNCTION sdd_execute_idu_relleno(character varying, integer, character varying, character varying, integer, smallint);

CREATE OR REPLACE FUNCTION sdd_execute_idu_relleno(s_tabla_nom character varying, i_id integer, s_descripcion character varying, s_sintetico character varying, i_estado integer, i_oper smallint)
RETURNS integer AS
$BODY$
DECLARE s_error VARCHAR(255);
DECLARE s_dinamic_sql TEXT;
DECLARE i_error INTEGER;
DECLARE i_return SMALLINT;
DECLARE s_descp_exec VARCHAR(255);
DECLARE s_log VARCHAR(255);
DECLARE s_opera VARCHAR(20);
BEGIN
/*
Funcion:
Permite realizar la ejecucion dinamicas de las funciones
Parametros:
Los valores fijos de las tablas de rellenos son:
i_id--> El valor identificador de la tabla es un valor SERIAL
s_descripcion --> Contiene la descripcion de la tabla de relleno es un valor del tipo char
i_estado--> es el estado que contiene en la tabla 1/habilitado-0/inhabilitado
i_oper --> Contien el tipo de operacion a realizar 1/Delte-2/Insert-3/delete
*/


i_return := 0;
/*
Las tipos de operaciones de IDU se encuentran marcadas por i_oper
validamos que se ingrese un valor valido 0 o NULL son no validos
*/
IF (i_oper = NULL) OR (i_oper <= 0) THEN
s_error := 'No se ingreso ningún valor para realizar operacion i_oper';
RAISE WARNING '%',s_error;
i_error = 25000;
RETURN i_error;
END IF;

/*
1 - Operacion del tipo DELETE(1)
*/
IF (i_oper = 1) THEN
/*
Validamos el estado de la clave principal :-)
*/
IF (i_id = NULL) OR (i_id = 0) THEN
s_error := 'No se ingreso un identificador valido para borrar i_id';
RAISE WARNING '%',s_error;
i_error := 30000;
RETURN i_error; /*Id para delete*/
END IF;

/*
Ejecucion dinamica del select esto puede se aplicado al final
*/
s_dinamic_sql := 'DELETE FROM '||s_tabla_nom||' WHERE id = '||to_char(i_id,'999');
s_descp_exec := 'borro';
/*
Marcamos la etiqueta para que el log marque q estamos haciendo
*/
s_opera := 'DELETE =>';
END IF;


/*
Controlde Nulidad tanto para Insert Como Update es el mismo :-)
*/

If(i_oper = 1) OR (i_oper = 2) Then
/*
Validamos la existencia de los valores para la clave principal
*/

i_error := 0;
/*=========================================================================================*/
/*CONTROL DE NULIDAD DE VARIABLES NO NULAS APRA REALIZAR EL INSERT DE LOS DATOS */
/*=========================================================================================*/
IF (s_descripcion IS NULL) OR(s_sintetico IS NULL) OR (i_estado = NULL) THEN

IF (descripcion IS NULL) THEN
s_error := s_error||'descripcion';
END IF;
IF (sintetico IS NULL) THEN
s_error := s_error||'sintetico';
END IF;

IF (i_estado IS NULL) THEN
s_error := s_error||'estado';
END IF;

RAISE WARNING 'Parametros nulos (%)',s_error;
i_error := 24000;
RETURN i_error;
END IF;

End If;

/*
2 - Operacion del Tipo Insert(2)
*/

IF (i_oper = 2) THEN
s_dinamic_sql :='INSERT INTO '||s_tabla_nom||'
(descripcion,sintetico,estado)
VALUES('||quote_literal(s_descripcion)||','||
quote_literal(s_sintetico)||','||
to_char(i_estado,'999')||')';

s_opera := 'INSERT =>';
END IF;

/*
3 - Operacion de Update (3)
*/
IF (i_oper = 3) THEN
/*
SP dinamico de UPDATE
*/
s_dinamic_sql := 'UPDATE '||s_tabla_nom||' SET '||
'descripcion= '||quote_literal(s_descripcion)||','||
' sintetico= '||quote_literal(s_sintetico)||','||
' estado= '||to_char(i_estado,'999')||
' WHERE id= '||to_char(i_id,'999');
s_opera := 'UPDATE =>';
END IF;

/*
Ejecutamos el valor de forma dinamica esto es posible ya
que las operaciones de IDU siempre devuelve la cantidad
de filas afectadas
*/

EXECUTE s_dinamic_sql;

/*
Controlamos que se ejecute el proceso
*/
GET DIAGNOSTICS i_return = ROW_COUNT;
IF i_return >0 THEN
i_error :=0;
/*
Guardamo en el log el evento para control a posteridad
*/
s_log := s_opera||' Tabla de relleno '||s_tabla_nom||' i_id:'||to_char(i_id,'999');
SELECT * INTO i_error FROM ssg_iutsg_log_admin('4',s_log);
ELSE
i_error := 26000;
RAISE WARNING 'No se % ningun valor para la clave: (%)',s_descp_exec,s_dinamic_sql;
RETURN i_error; /*los errores de 600 son de UDI*/
END IF;


RETURN i_error;

END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION sdd_execute_idu_relleno(character varying, integer, character varying, character varying, integer, smallint) OWNER TO <>;

No hay comentarios:

Publicar un comentario