Re: Error en función para devolver todos los records en un refcursor

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Marcos Luis Ortiz Valmaseda <marcosluis2186(at)googlemail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Error en función para devolver todos los records en un refcursor
Date: 2011-08-18 15:40:44
Message-ID: 1313681828-sup-1358@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Excerpts from Marcos Luis Ortiz Valmaseda's message of jue ago 18 11:30:57 -0400 2011:
> Saludos a los listeros
> Estoy teniendo problemas con una función que debe devolver todos los records
> de una determinada función, que devuelve un refcursor.
> Acá les dejo el código:
>
> CREATE OR REPLACE FUNCTION return_refcursor_fetch_all(text, refcursor,
> anyarray)
> RETURNS REFCURSOR AS $$
> DECLARE
> v_func ALIAS FOR $1; -- Funcion original
> v_ref refcursor; -- Ref cursor de la funcion original
> v_ref_2 refcursor;
> v_params ALIAS FOR $3; -- Parametros de la funcion
> v_array_position int4; -- Posicion del arreglo para la comparacion
> v_temp_text text ; -- Variable temporal para la consulta
> v_cant_params int4;
> BEGIN
> -- Insertar codigo de la funcion en forma de texto y ejecutarla a una
> variable
> v_array_position := 0;
> v_temp_text := '';
> v_cant_params := array_lenght(v_params, 1); -- Calcula la cantidad de
> parametros
>
> -- Recorrer todo el array para construir la candena de los parametros
> WHILE v_array_position <= cant_params LOOP
> v_temp_text := (v_temp_text ||', ' ||
> (v_params[v_array_position])::text); -- Concatena todo y construye la
> cadena de los parametros
> END LOOP;
> -- Ejecutar la consulta construida dinamicamente usando EXECUTE
> EXECUTE 'SELECT * FROM '|| v_func ||'('|| v_temp_text || ') INTO ' ||
> v_ref || ';';
> OPEN v_ref_2 FOR SELECT * FROM v_ref;
> RETURN v_ref_2;
> END;
> $$ LANGUAGE plpgsql;
>
> Y la forma que la estamos usando es así:
> select * from
> return_refcursor_fetch_all('schema_auditoria.fn_consultar_transaccion',
> 'p_cursor_registros',
> '{null,null,null,null,null,null,null,null,p_cursor_numregistros,p_cursor_registros}');

No entiendo la intención de tu función. Si asumes que los parámetros
son todos text o convertibles a text a través de un cast, ¿por qué no
pasas text[] en vez de anyarray? Creo que el problema es la invocación
a v_func, es decir la función que pasas como parámetro, no
return_refcursor_fetch_all, pero no estoy seguro.

¿Qué estás tratando de hacer? La verdad es que no veo el propósito de
todo esto. Tomas una función que retorna un refcursor, luego abres ese
refcursor, metes los resultados en otro refcursor y retornas el segundo
refcursor ... ¿?

--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Marcos Luis Ortiz Valmaseda 2011-08-18 16:03:25 Re: [pgsql-es-ayuda] Error en función para devolver todos los records en un refcursor
Previous Message Marcos Luis Ortiz Valmaseda 2011-08-18 15:30:57 Error en función para devolver todos los records en un refcursor