jueves, 20 de octubre de 2011

Postgres - función para hallar duplicados de personal en una tabla


La tabla se llama PERSONAL y tiene los campos de tipo varchar:
pers_id -> identificación
pers_pat -> apellido paterno
pers_mat -> apellido materno
pers_nom -> nombres

La idea es saber qué personas tienen registros duplicados


CREATE OR REPLACE FUNCTION base.duplicado_personal_hallar(cschema character varying)
  RETURNS SETOF record AS
$BODY$

declare
r record; cpat varchar := '';  cmat varchar := '';  cnom varchar := '';
BEGIN
execute 'set search_path to ' || cschema || ', base, public' ;

create temp table tmp_persdup (pers_id character varying(20) ,  pers_pat character varying(25) DEFAULT '',
pers_mat character varying(25) DEFAULT '',  pers_nom character varying(30) DEFAULT '' ) on commit drop  ;

for r in select pers_id, pers_pat, pers_mat, pers_nom from personal
order by pers_pat, pers_mat, pers_nom
loop
if r.pers_pat = cpat and r.pers_mat= cmat and r.pers_nom= cnom then
insert into tmp_pers_dup (pers_id, pers_pat,pers_mat, pers_nom) values
(r.pers_id, r.pers_pat ,r.pers_mat, r.pers_nom);
end if;
cpat := r.pers_pat; cmat := r.pers_mat; cnom:= r.pers_nom;
end loop;

return query select pers_id, pers_pat ,pers_mat, pers_nom from tmp_persdup;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION base.duplicado_personal_hallar(character varying) OWNER TO postgres;

No hay comentarios:

Publicar un comentario