lunes, 6 de octubre de 2008

Error en el Return Next

Error al Ejecutar Funcion en plpgsql, como aso curioso me ocurrio este error:

ERROR: se llama una funcion que retorna un conjunto en un contexto que no puede aceptarlo
CONTEXT: PL/pgSQL function "get_record_cadenas" line 7 at return next

Lamentablemente no encontre la solucion facilmente, aqui un ejemplo de una funcion, el error y la solucion:


CREATE OR REPLACE FUNCTION maestros.get_record_cadenas(campod bpchar, tabla bpchar, campof bpchar, cadena bpchar)
RETURNS SETOF record AS
$BODY$
declare
record1 record;
begin
--*
FOR record1 IN execute 'select ' || $1 || ' from ' || $2 || ' where position(' || $3 || ' in ' || quote_literal($4) || ') > 0' LOOP
return next record1;
end loop;
return;
end
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Al llamar a la funcion de esta forma:

select maestros.get_record_cadenas('usu_nombre', 'maestros.usuarios', 'usu_codigo', '003--*--GERENCIA')

Me arrojaba el error arriba indicado en rojo.

La solucion resulta bastante simple:

select * from maestros.get_record_cadenas('nombres', 'clientes', 'codigo', 'valor1*valor2*valor3') as (usuario varchar);

2 comentarios:

gabriel.munoz dijo...

A mi me paso algo parecido, en vez de tener ... returns setof record as ... yo tenía ... returns setof nombre_de_vista as ... y el me daba el mismo error que vos. Pero el problema estaba en como ejecutaba la funcion yo hacia: select nombre_de_funcion() y la solución fue hacer select * from nombre_de_funcion().
Muchas gracias con este post encontré el error estaba dando vueltas unas 3 horas.
Saludos, Gabriel.

MiniProject dijo...

Gracias! estaba con el mismo error, y efectivamente es lo que comentas, puesto que lo que se devuelve es una tabla.

Gracias nueva vez Gabriel.

Att: Mairelin