2010/12/7 Patricio Cardenas Garay <[email protected]>: > > > > > Tengo esto > > > > CREATE OR REPLACE FUNCTION anosaprobados () > > RETURNS SETOF respuesta_anoscursados AS > > $BODY$ > > DECLARE > > RESPUESTA RECORD; > > BEGIN > > FOR RESPUESTA IN ( > > SELECT pro.rut_alumno,inst.rdb, > > inst.nombre_instit,anes.nro_ano, > > pro.id_ano,(cu.grado_curso || '-' || cu.letra_curso) as cursoletra > > FROM promocion pro > > inner join institucion inst on inst.rdb = pro.rdb > > inner join ano_escolar anes on anes.id_ano = pro.id_ano > > inner join matricula ma on ma.id_ano = pro.id_ano and ma.rut_alumno = > 18018550 > > inner join curso cu on cu.id_ano = anes.id_ano and cu.ensenanza > 110 and > cu.id_curso = ma.id_curso > > WHERE > > pro.rut_alumno = 18018550 and pro.situacion_final = 1 and pro.promedio > > 0 and pro.asistencia > 0 > > ORDER BY anes.nro_ano) > > LOOP > > RETURN NEXT RESPUESTA; > > END LOOP; > > RETURN; > > END; > > $BODY$ > > LANGUAGE plpgsql; > > > > Con esto > > > > CREATE TYPE respuesta_anoscursados AS > > (rut_alumno int4,rdb int4,nombre_instit text,nro_ano int4,id_ano > int4,cursoletra text) > > > > > > Me retorna esto > > > > ERROR: wrong record type supplied in RETURN NEXT > > CONTEXT: PL/pgSQL function "anosaprobados" line 17 at return next > > > > Como lo puedo arreglar por favor
El problema está en los tipos de datos que se estan regresando dentro del record respuesta, para asegurar que estas regresar el tipo de dato que esta esperando según el tipo de dato que creaste, haz un cast a todas las columnas del select. Por otra parte, podrias hacer la declaración de los parametros de salida en la misma función, para evitar crear un tipo de dato nuevo: CREATE OR REPLACE FUNCTION anosaprobados ( OUT rut_alumno int4, OUT rdb int4, OUT nombre_instit text, OUT nro_ano int4, OUT id_ano int4, OUT cursoletra text ) RETURNS SETOF record AS $BODY$ DECLARE RESPUESTA RECORD; BEGIN FOR RESPUESTA IN ( SELECT pro.rut_alumno,inst.rdb, inst.nombre_instit,anes.nro_ano, pro.id_ano,(cu.grado_curso || '-' || cu.letra_curso) as cursoletra FROM promocion pro inner join institucion inst on inst.rdb = pro.rdb inner join ano_escolar anes on anes.id_ano = pro.id_ano inner join matricula ma on ma.id_ano = pro.id_ano and ma.rut_alumno = 18018550 inner join curso cu on cu.id_ano = anes.id_ano and cu.ensenanza > 110 and cu.id_curso = ma.id_curso WHERE pro.rut_alumno = 18018550 and pro.situacion_final = 1 and pro.promedio > 0 and pro.asistencia > 0 ORDER BY anes.nro_ano) LOOP RETURN NEXT RESPUESTA; END LOOP; RETURN; END; $BODY$ LANGUAGE plpgsql; - Enviado a la lista de correo pgsql-es-ayuda ([email protected]) Para cambiar tu suscripción: http://www.postgresql.org/mailpref/pgsql-es-ayuda
