Error al migrar desde CSV. Incongruencia entre error de pentaho y ejec en db

Estoy trabajando con la versión 3.18.1.

Eliminé el schema ext y empecé de nuevo.

El error es el siguiente

2022/06/14 10:00:06 - Spoon - Iniciando trabajo…
2022/06/14 10:00:06 - prectrl_personas - Ejecución del trabajo comenzada
2022/06/14 10:00:06 - prectrl_personas - Entrada de comienzo [Crea tipo de datos]
2022/06/14 10:00:07 - prectrl_personas - Entrada de comienzo [fx_prectrl_personas]
2022/06/14 10:00:07 - fx_prectrl_personas - ERROR (version 8.3.0.0-371, build 8.3.0.0-371 from 2019-06-11 11.09.08 by buildguy) : Ocurrió un error al ejecutar esta entrada de trabajo:
2022/06/14 10:00:07 - fx_prectrl_personas - Couldn’t execute SQL: CREATE OR REPLACE FUNCTION ext.sp_ctrl_personas() RETURNS SETOF ext.control_type AS $$
2022/06/14 10:00:07 - fx_prectrl_personas - DECLARE
2022/06/14 10:00:07 - fx_prectrl_personas - sql text;
2022/06/14 10:00:07 - fx_prectrl_personas - r ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - v_ok text;
2022/06/14 10:00:07 - fx_prectrl_personas - cursor1 RECORD;
2022/06/14 10:00:07 - fx_prectrl_personas - BEGIN
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - SET search_path = ${pg_esquema};
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT apellido,nombres,tipo_documento,nro_documento,count() FROM ext.mig_personas GROUP BY apellido,nombres,tipo_documento,nro_documento HAVING count()>1) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT apellido,nombres,tipo_documento,nro_documento,count() FROM ext.mig_personas GROUP BY apellido,nombres,tipo_documento,nro_documento HAVING count()>1’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros duplicados para el un mismo tipo_documento y nro_documento, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT tipo_documento,nro_documento,count() FROM ext.mig_personas GROUP BY tipo_documento,nro_documento HAVING count()>1) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT tipo_documento,nro_documento,count() FROM ext.mig_personas GROUP BY tipo_documento,nro_documento HAVING count()>1’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros duplicados para el un mismo tipo_documento y nro_documento, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE sexo NOT IN (SELECT sexo FROM mdp_personas_sexo)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE sexo NOT IN (SELECT sexo FROM mdp_personas_sexo)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo sexo distintos a valores (F y M) verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE institucion IS NOT NULL AND institucion NOT IN (SELECT institucion FROM sga_instituciones)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE institucion IS NOT NULL AND institucion NOT IN (SELECT institucion FROM sga_instituciones)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo INSTITUCION que no estan en la tabla sga_instituciones, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE localidad_nacimiento IS NOT NULL AND localidad_nacimiento NOT IN (SELECT localidad FROM mug_localidades)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE localidad_nacimiento IS NOT NULL AND localidad_nacimiento NOT IN (SELECT localidad FROM mug_localidades)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo LOCALIDAD_NACIMIENTO que no estan en la tabla mug_localidades, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE localidad IS NOT NULL AND localidad NOT IN (SELECT localidad FROM mug_localidades)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE localidad IS NOT NULL AND localidad NOT IN (SELECT localidad FROM mug_localidades)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo LOCALIDAD que no estan en la tabla mug_localidades, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE nacionalidad NOT IN (SELECT nacionalidad FROM mdp_nacionalidades)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE nacionalidad NOT IN (SELECT nacionalidad FROM mdp_nacionalidades)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo nacionalidad que no estan en la tabla mug_nacionalidades, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE pais_origen NOT IN (SELECT pais FROM mug_paises)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE pais_origen NOT IN (SELECT pais FROM mug_paises)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo pais_origen que no estan en la tabla mug_paises, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE pais_documento NOT IN (SELECT pais FROM mug_paises)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE pais_documento NOT IN (SELECT pais FROM mug_paises)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo pais_documento que no estan en la tabla mug_paises, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE tipo_documento NOT IN (SELECT tipo_documento FROM mdp_tipo_documento)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE tipo_documento NOT IN (SELECT tipo_documento FROM mdp_tipo_documento)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo tipo_documento que no estan en la tabla mdp_tipo_documento, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE estado_civil NOT IN (SELECT estado_civil FROM mdp_estados_civiles)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE estado_civil NOT IN (SELECT estado_civil FROM mdp_estados_civiles)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo estado_civil que no estan en la tabla mdp_estados_civiles, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE estado IS NOT NULL AND estado NOT IN (‘F’, ‘A’,‘C’) AND estado IS NOT NULL) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=E’SELECT * FROM ext.mig_personas WHERE estado IS NOT NULL AND estado NOT IN ('F','A','C') AND estado IS NOT NULL’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros en el campo ESTADO del titulo no validos. Valores: F-Finalizado C-En curso A-Abandono, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas m WHERE EXISTS
2022/06/14 10:00:07 - fx_prectrl_personas - (SELECT ‘’ FROM mdp_personas_documentos p WHERE p.tipo_documento = m.tipo_documento AND p.nro_documento = m.nro_documento )) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas m WHERE EXISTS (SELECT * FROM mdp_personas_documentos p WHERE p.tipo_documento = m.tipo_documento
2022/06/14 10:00:07 - fx_prectrl_personas - AND p.nro_documento = m.nro_documento )’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay personas con tipo y nro_documento ya ingresados a Guarani (ver en mdp.personas), verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE usuario IS NOT NULL AND usuario IN (SELECT usuario FROM mdp_personas)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE usuario IS NOT NULL AND usuario IN (SELECT usuario FROM mdp_personas)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay datos de codigo de acceso al sistema (USUARIO) que ya existen en Guarani 3, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE titulo IS NOT NULL AND titulo NOT IN (SELECT titulo FROM mdp_titulos)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE titulo IS NOT NULL AND titulo NOT IN (SELECT titulo FROM mdp_titulos)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay datos de titulo (TITULO) que no existen en mdp_titulos, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE nivel_estudio IS NOT NULL AND nivel_estudio NOT IN (SELECT nivel_estudio FROM mdp_nivel_estudio)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE nivel_estudio IS NOT NULL AND nivel_estudio NOT IN (SELECT nivel_estudio FROM mdp_nivel_estudio)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay datos de nivel de estudio (NIVEL_ESTUDIO) que no existen en mdp_nivel_estudio, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE cobertura_salud IS NOT NULL AND cobertura_salud NOT IN (SELECT cobertura_salud FROM mdp_cobertura_salud)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE cobertura_salud IS NOT NULL AND cobertura_salud NOT IN (SELECT cobertura_salud FROM mdp_cobertura_salud)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay datos de cobertura de salud (COBERTURA_SALUD) que no existen en mdp_cobertura_salud, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE trabajo_existe IS NOT NULL AND trabajo_existe NOT IN (SELECT trabajo_existe FROM mdp_trabajo_existe)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE trabajo_existe IS NOT NULL AND trabajo_existe NOT IN (SELECT trabajo_existe FROM mdp_trabajo_existe)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay datos de trabajo existe (TRABAJO_EXISTE) que no existen en mdp_trabajo_existe, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE extract(year from fecha_nacimiento) >= (extract(year from current_date) - 15 )) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE extract(year from fecha_nacimiento) >= (extract(year from current_date) - 15 )’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay registros con fecha de nacimiento menores a 15 años, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE colegio IS NOT NULL AND colegio NOT IN (SELECT colegio FROM sga_colegios_secundarios)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE colegio IS NOT NULL AND colegio NOT IN (SELECT colegio FROM sga_colegios_secundarios)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay colegios secundarios (COLEGIO) que no se encuentran en sga_colegios_secundarios, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE trabajo_hora_sem IS NOT NULL AND trabajo_hora_sem NOT IN (SELECT trabajo_hora_sem FROM mdp_trabajo_horas_sem)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE trabajo_hora_sem IS NOT NULL AND trabajo_hora_sem NOT IN (SELECT trabajo_hora_sem FROM mdp_trabajo_horas_sem)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay HORAS TRABAJADAS EN LA SEMANA (trabajo_hora_sem) que no se encuentran en trabajo_hora_sem, verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - IF EXISTS (SELECT * FROM ext.mig_personas WHERE turno_preferido_cursada IS NOT NULL AND turno_preferido_cursada NOT IN (SELECT turno FROM sga_turnos_cursadas)) THEN
2022/06/14 10:00:07 - fx_prectrl_personas - sql=‘SELECT * FROM ext.mig_personas WHERE turno_preferido_cursada IS NOT NULL AND turno_preferido_cursada NOT IN (SELECT turno FROM sga_turnos_cursadas)’;
2022/06/14 10:00:07 - fx_prectrl_personas - r := (false,‘Error: Hay TURNOS PREFERIDOS DE CURSADAS (turno_preferido_cursada) que no se encuentran en la tabla de turnos (sga_turnos_cursadas), verifique!!’,sql)::ext.control_type;
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN NEXT r;
2022/06/14 10:00:07 - fx_prectrl_personas - END IF;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - RETURN;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - END
2022/06/14 10:00:07 - fx_prectrl_personas - $$ LANGUAGE plpgsql;
2022/06/14 10:00:07 - fx_prectrl_personas -
2022/06/14 10:00:07 - fx_prectrl_personas - ERROR: syntax error at or near “$”
Position: 197