Proba correr esto:
DO $$
DECLARE i integer;
BEGIN
select count(*) INTO i
from pg_class as c, pg_namespace as n
where c.relname = 'control_type'
and c.relnamespace = n.oid
and n.nspname = 'ext'; -- esquema de migracion externo.
IF i = 0 THEN
-- DROP TYPE ext.control_type
CREATE TYPE ext.control_type AS (
estado boolean,
mensaje text,
query text
);
END IF;
END $$;
DROP FUNCTION IF EXISTS ext.sp_ctrl_equivalencia()
CREATE OR REPLACE FUNCTION ext.sp_ctrl_equivalencia() RETURNS SETOF ext.control_type AS $$
DECLARE
sql text;
r ext.control_type;
v_ok text;
_cnt_reg INTEGER;
_cnt_nulo INTEGER;
_cnt_not_nulo INTEGER;
_b INTEGER;
cursor1 RECORD;
cursor2 RECORD;
BEGIN
-- +++++++ Controles: Personas ++++++++--
SET search_path = negocio;
-- +++++++ controles para la tabla plana mig_equivalencia
-- +++++++ Controles: Alumnos ++++++++--
-- Verifico que el alumno exista en G3.
IF EXISTS (SELECT tipo_documento, nro_documento, propuesta_alumno FROM ext.mig_equivalencia as e
WHERE NOT EXISTS (SELECT 1 FROM mdp_personas_documentos as pd, sga_alumnos as a
WHERE pd.tipo_documento = e.tipo_documento
AND pd.nro_documento = e.nro_documento
AND a.persona = pd.persona
AND a.propuesta = e.propuesta_alumno)) THEN
sql='SELECT tipo_documento, nro_documento, propuesta_alumno FROM ext.mig_equivalencia as e
WHERE NOT EXISTS (SELECT 1 FROM mdp_personas_documentos as pd, sga_alumnos as a
WHERE pd.tipo_documento = e.tipo_documento
AND pd.nro_documento = e.nro_documento
AND a.persona = pd.persona
AND a.propuesta = e.propuesta_alumno)';
r := (false,'Error: Hay alumnos que no estan en Guarani 3, verifique!!',sql)::control_type;
RETURN NEXT r;
END IF;
-- Que el alumno exista en la propuesta y en la version del plan de estudios.
IF EXISTS (SELECT tipo_documento, nro_documento, propuesta_alumno, plan_version FROM ext.mig_equivalencia
EXCEPT
SELECT pd.tipo_documento, pd.nro_documento, a.propuesta, a.plan_version
FROM mdp_personas_documentos as pd, sga_alumnos as a
WHERE a.persona = pd.persona) THEN
sql='SELECT tipo_documento, nro_documento, propuesta_alumno, plan_version FROM ext.mig_equivalencia
EXCEPT
SELECT pd.tipo_documento, pd.nro_documento, a.propuesta, a.plan_version
FROM mdp_personas_documentos as pd, sga_alumnos as a
WHERE a.persona = pd.persona';
r := (false,'Error: Hay alumnos y su version de plan de estudios (TIPO_DOCUMENTO + NRO_DOCUMENTO + PROPUESTA_ALUMNO + PLAN_VERSION) que no estan en Guarani 3 en la tabla sga_alumnos, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE plan_version NOT IN (SELECT plan_version FROM sga_planes_versiones)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE plan_version NOT IN (SELECT plan_version FROM sga_planes_versiones)';
r := (false,'Error: hay datos en el campo PLAN_VERSION que no existen en Guarani 3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE propuesta_alumno NOT IN (SELECT propuesta FROM sga_propuestas)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE propuesta_alumno NOT IN (SELECT propuesta FROM sga_propuestas)';
r := (false,'Error: Hay datos en el campo PROPUESTA_ALUMNO que no se encuentran cargados en Guarani 3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen NOT IN (SELECT origen FROM sga_equiv_tramite_origen)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE origen NOT IN (SELECT origen FROM sga_equiv_tramite_origen)';
r := (false,'Error: Hay datos en el campo ORIGEN que no se encuentran cargados en Guarani3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE documento_tipo NOT IN (SELECT documento_tipo FROM sga_documentos_tipos)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE documento_tipo IN (SELECT documento_tipo FROM sga_documentos_tipos)';
r := (false,'Error: Hay datos en el campo DOCUMENTO_TIPO que no son validos, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE institucion IS NOT NULL AND institucion NOT IN (SELECT institucion FROM sga_instituciones)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE institucion IS NOT NULL AND institucion NOT IN (SELECT intitucion FROM sga_instituciones)';
r := (false,'Error: Hay datos en el campo INSTITUCION que no son validos, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE responsable_academica IS NOT NULL AND responsable_academica NOT IN (SELECT responsable_academica FROM sga_responsables_academicas)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE responsable_academica IS NOT NULL AND responsable_academica NOT IN (SELECT responsable_academica FROM sga_responsables_academicas)';
r := (false,'Error: Hay datos en el campo RESPONSABLE_ACADEMICA que no son las validos, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE convenio IS NOT NULL AND convenio NOT IN (SELECT convenio FROM sga_convenios)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE convenio IS NOT NULL AND convenio NOT IN (SELECT convenio FROM sga_convenios)';
r := (false,'Error: Hay datos en el campo CONVENIO que no son validos, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE propuesta_origen IS NOT NULL AND propuesta_origen NOT IN (SELECT propuesta FROM sga_propuestas)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE propuesta_origen IS NOT NULL AND propuesta_origen NOT IN (SELECT propuesta FROM sga_propuestas)';
r := (false,'Error: Hay datos en el campo PROPUESTA_ORIGEN que no se encuentran cargados en Guarani 3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE plan_origen IS NOT NULL AND plan_origen NOT IN (SELECT plan FROM sga_planes)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE plan_origen IS NOT NULL AND plan_origen NOT IN (SELECT plan FROM sga_planes)';
r := (false,'Error: Hay datos en el campo PLAN_ORIGEN que no se encuentran cargados en Guarani 3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE elemento NOT IN (SELECT elemento FROM sga_elementos WHERE entidad_subtipo >= 50)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE elemento NOT IN (SELECT elemento FROM sga_elementos WHERE entidad_subtipo >= 50)';
r := (false,'Error: Hay datos el campo ELEMENTO que no se encuentran cargados en Guarani3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE instancia NOT IN (10,11,12)) THEN
sql=E'SELECT * FROM ext.mig_equivalencia WHERE instancia NOT IN (10,11,12)';
r := (false,'Error: Hay datos en el campo INSTANCIA que no son validos, valores correctos(10-Total,11-Regularidad,12-Parcial), verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE escala_nota NOT IN (SELECT escala_nota FROM sga_escalas_notas)) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE escala_nota NOT IN (SELECT escala_nota FROM sga_escalas_notas)';
r := (false,'Error: Hay datos en el campo ESCALA_NOTA que no se encuentran cargados en Guarani3, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- QUE Existan las notas en las escalas de notas
IF EXISTS (SELECT escala_nota, nota FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota FROM sga_escalas_notas_det) THEN
sql='SELECT escala_nota, nota FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota FROM sga_escalas_notas_det';
r := (false,'Error: Existe notas (ESCALA_NOTA + NOTA) que no existen en la tabla de escalas de nota de Guarnai 3 (sga_escalas_notas_det), verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- QUE Existan las notas y se corresponda el resultado en las escalas de notas
IF EXISTS (SELECT escala_nota, nota, resultado FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota, resultado FROM sga_escalas_notas_det) THEN
sql='SELECT escala_nota, nota, resultado FROM ext.mig_equivalencia WHERE nota IS NOT NULL EXCEPT SELECT escala_nota, nota, resultado FROM sga_escalas_notas_det';
r := (false,'Error: Existen resultados de notas (ESCALA_NOTA + NOTA + RESULTADO) que no existen en la tabla de escalas de notas de Guarnai 3 (sga_escalas_notas_det), verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- EQUIVALENCIAS EXTERNAS
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Denominacion origen de actividad externa
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND actividad_ext IS NULL) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND actividad_ext IS NULL';
r := (false,'Error: EQUIVALENCIA EXTERNA -> Debe ingresar la denominación de la actividad externa (ACTIVIDAD_EXT) que dio origen a la equivalencia, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- Fecha origen equiv externa
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND fecha_ext IS NULL) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (5,6,7) AND fecha_ext IS NULL';
r := (false,'Error: EQUIVALENCIA EXTERNA -> Debe ingresar la fecha de aprobacion/desaprobación de la actividad externa (FECHA_EXT) que dio origen a la equivalencia, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- EQUIVALENCIAS INTERNAS
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Que exista la propuesta origen
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND propuesta_origen IS NULL) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND propuesta_origen IS NULL';
r := (false,'Error: EQUIVALENCIA INTERNA -> Debe ingresar el dato de Propuesta Origen (PROPUESTA_ORIGEN), verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- Que exista la actividad origen
IF EXISTS (SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND actividad_int IS NULL) THEN
sql='SELECT * FROM ext.mig_equivalencia WHERE origen IN (1,2,3,4) AND actividad_int IS NULL';
r := (false,'Error: EQUIVALENCIA INTERNA -> Debe ingresar el dato de Actividad Origen (ACTIVIDAD_INT), verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- Que la actividad exista en la base
IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.actividad_int IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sga_elementos as e WHERE e.elemento = eq.actividad_int AND e.entidad_subtipo >= 50)) THEN
sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.actividad_int IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sga_elementos as e WHERE e.elemento = eq.actividad_int AND e.entidad_subtipo >= 50)';
r := (false,'Error: EQUIVALENCIA INTERNA -> El dato de la Actividad Origen (ACTIVIDAD_INT) no se corresponde con una actividad, verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- Que este cargada una fecha
IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.fecha_int IS NULL) THEN
sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.fecha_int IS NULL';
r := (false,'Error: EQUIVALENCIA INTERNA -> Falta ingresar el dato de la fecha Origen (FECHA_INT), verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- El origen de la actividad origen debe ser uno de los siguietnes
IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.origen_int NOT IN ('Examen','Cursada', 'Promocion','Equivalencia','Resolucion')) THEN
sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.origen_int NOT IN (''Examen'',''Cursada'', ''Promocion'',''Equivalencia'',''Resolucion'')';
r := (false,'Error: EQUIVALENCIA INTERNA -> El origen (ORIGEN_INT) de la actividad origen debe ser uno de los siguientes: Examen, Cursada, Promocion, Equivalencia, Resolucion. Verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
-- El resultado de la actividad origen debe ser uno de los siguientes
IF EXISTS (SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.resultado_int NOT IN ('A','R')) THEN
sql='SELECT * FROM ext.mig_equivalencia as eq WHERE eq.origen IN (1,2,3,4) AND eq.resultado_int NOT IN (''A'',''R'')';
r := (false,'Error: EQUIVALENCIA INTERNA -> El resultado (RESULTADO_INT) de la actividad origen debe ser uno de los siguientes: A, R. Verifique!!',sql)::ext.control_type;
RETURN NEXT r;
END IF;
RETURN;
END
$$ LANGUAGE plpgsql;
y despues ejecutar esta funcion:
select * from ext.sp_ctrl_equivalencia();