Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Devolviendo un refcursor

Estas en el tema de Devolviendo un refcursor en el foro de PostgreSQL en Foros del Web. Soy nuevo aqui en estos foros y les pido ayuda porque ya no se que hacer. Mi problema es el siguiente: quiero devolver datos de ...
  #1 (permalink)  
Antiguo 05/10/2009, 13:26
 
Fecha de Ingreso: octubre-2009
Mensajes: 2
Antigüedad: 15 años, 1 mes
Puntos: 0
Devolviendo un refcursor

Soy nuevo aqui en estos foros y les pido ayuda porque ya no se que hacer.

Mi problema es el siguiente: quiero devolver datos de varias tablas pero la función debe recibir 2 parámetros por los cuales debe filtrar los resultados de la consulta, el problema es que lo estoy haciendo con refcursors, entonces probando yo para buscar soluciones cuando la función no recibe parámetros el refcursor me devuelve la consulta con todos los datos y lo puedo obtener en el Visual Studio todo ok, pero cuando le agrego los parámetros aunque no los use en la función, es decir, por el simple hecho de agregar parámetros el refcursor me devuelve <unnamed portal 1>.

El codigo de la funcion con el parametro es:

CREATE OR REPLACE FUNCTION "public"."probando" (pnombre varchar) RETURNS "pg_catalog"."refcursor" AS
$body$
DECLARE
miCursor refcursor;
BEGIN
OPEN miCursor FOR
SELECT
public.nrol.nomb_rol,
public.ntipo_persona.tipo_persona,
public.dpersona.nombres,
public.dpersona.apellido1,
public.dpersona.apellido2,
public.dpersona.ci,
public.dpersona.correo,
public.dpersona.usuario,
public.dpersona.contrasenna,
public.dpersona.id_persona
FROM
public.dpers_rol_privil
INNER JOIN public.ntipo_persona ON (public.dpers_rol_privil.id_tipo_persona = public.ntipo_persona.id_tipo_persona)
INNER JOIN public.nrol ON (public.dpers_rol_privil.id_rol = public.nrol.id_rol)
INNER JOIN public.dpersona ON (public.dpers_rol_privil.id_persona = public.dpersona.id_persona)
WHERE public.dpersona.nombres like '$1%';
RETURN miCursor;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


y este es el codigo de Visual Studio, estoy probandolo con una console application:

Console.Write("Nombre: ");
string varNombre = Console.ReadLine();
DBManager pgConection = new DBManager();
pgConection.OpenConection();
NpgsqlCommand command = pgConection.ConfigureCommand("probando", pgConection.Postgre, CommandType.StoredProcedure);
command.Parameters.Add(pgConection.ConfigureParame ter(DbType.String, varNombre));
NpgsqlTransaction trans = pgConection.Postgre.BeginTransaction();
NpgsqlDataReader dr = command.ExecuteReader();
trans.Commit();
while (dr.Read())
for (int k = 0; k < dr.FieldCount; k++)
Console.WriteLine(dr.GetValue(k));
Console.ReadKey();

cuando le quito el parametro a la funcion y la llamo me devuelve los datos aca en la consola normalmente, pero cuando le agrego el parametro incluso aunque no lo use en la funcion solo muestra: <unnamed portal 1>

Nota: DBManager es una clase que yo hice para manejar la BD al igual que el metodo ConfigureParameter();

Saludos, Y.
  #2 (permalink)  
Antiguo 05/10/2009, 13:39
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Devolviendo un refcursor

Abres el cursor pero no lo estas recorriendo.

<unnamed portal 1> aca realmente está devolviendo el cursor, pero que necesitarías que devolviera? Donde lo recorres?

HiperYoss y para una próxima ocasión, no repitas los temas. Haz puesto el mismo tema en dos post diferentes.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 06/10/2009, 08:01
 
Fecha de Ingreso: septiembre-2008
Mensajes: 75
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Devolviendo un refcursor

Hola si lo que quieres es obtener un "recordset" te sugiero que utilices return query me parece la opcion mas sencilla, te detallo con un pequeño ejemplo:

CREATE OR REPLACE FUNCTION pa_devuelverst(xfiltro character)
RETURNS SETOF record AS
$BODY$BEGIN
return query SELECT campo1::text,campo2::real
FROM tabla
WHERE campofiltro=xfiltro;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE

espero poder ayudarte, bye
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:23.