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

Que falla en este Procedimiento Almacenado ?

Estas en el tema de Que falla en este Procedimiento Almacenado ? en el foro de PostgreSQL en Foros del Web. Buenas tardes foreros: Tengo este Procedimiento Almacenado, que al crearlo se crea sin problemas: Código: CREATE OR REPLACE FUNCTION pdameusuario(pnum_identidad bpchar, pclave bpchar) RETURNS SETOF ...
  #1 (permalink)  
Antiguo 09/12/2007, 13:26
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Que falla en este Procedimiento Almacenado ?

Buenas tardes foreros:

Tengo este Procedimiento Almacenado, que al crearlo se crea sin problemas:
Código:
CREATE OR REPLACE FUNCTION pdameusuario(pnum_identidad bpchar, pclave bpchar) RETURNS SETOF refcursor AS
$BODY$
DECLARE curCursor refcursor;
BEGIN

	--ACCEDIO POR CERTIFICADO
	IF pclave='' THEN
		OPEN curCursor FOR SELECT cod_usuario, num_identidad, clave, nombre, apellido_1, apellido_2, 
					calle, email, TUSUARIOS.cod_pais, TPAISES.PAIS, TUSUARIOS.cod_provincia, TPROVINCIAS.provincia, ciudad, codigo_postal, 
					fec_alta, foto, notificar_email, estrellas, cuenta_activa
				  
					FROM tusuarios
						INNER JOIN TPAISES
							ON TPAISES.COD_PAIS = TUSUARIOS.COD_PAIS
						INNER JOIN TPROVINCIAS
							ON TPROVINCIAS.COD_PROVINCIA = TUSUARIOS.COD_PROVINCIA

					WHERE NUM_IDENTIDAD = pnum_identidad;
		RETURN NEXT curCursor;
	END IF;
	
	--ACCEDIO NORMAL
	IF pnum_identidad<>'' and pclave<>'' THEN
		OPEN curCursor FOR SELECT cod_usuario, num_identidad, clave, nombre, apellido_1, apellido_2, 
					calle, email, TUSUARIOS.cod_pais, TPAISES.PAIS, TUSUARIOS.cod_provincia, TPROVINCIAS.provincia, ciudad, codigo_postal, 
					fec_alta, foto, notificar_email, estrellas, cuenta_activa
				  
					FROM tusuarios
						INNER JOIN TPAISES
							ON TPAISES.COD_PAIS = TUSUARIOS.COD_PAIS
						INNER JOIN TPROVINCIAS
							ON TPROVINCIAS.COD_PROVINCIA = TUSUARIOS.COD_PROVINCIA

					WHERE NUM_IDENTIDAD = pnum_identidad
					AND   CLAVE =pclave;
		RETURN NEXT curCursor;
	END IF;

	RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Pregunta, ¿Como debo llamarlo para comprobar que me funciona y me devuelve datos?

Cuando lo ejecuto me sale el siguiente resultado: "<unnamed portal 1>"
__________________
Charlie.
  #2 (permalink)  
Antiguo 10/12/2007, 04:06
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Que falla en este Procedimiento Almacenado ?

Charlie la documentación es muy buena, es tu amiga

Esto no te lo contesto, pero te doy el link
http://www.postgresql.org/docs/8.2/i...l-cursors.html

Si despues te quedan dudas... avisa!
  #3 (permalink)  
Antiguo 10/12/2007, 14:59
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Que falla en este Procedimiento Almacenado ?

Buenas de nuevo Foreros.

En primer lugar, agradecerte nuevamente Seyko por tu ayuda, muchos de los avances que he hecho han sido gracias a tu respuestas, asi que no esta de mas ser agradecido, por lo que reitero mis agradecimientos.

Y en segundo lugar, jejejeje, bien, he mirado la página y bueno he visto algo que he solido hacer para hacer mis pruebas.

Cuando creo una funcion que recibe como parametro un refcursor, bien, no tengo problema para recuperar los datos de la funcion:
Código:
FUNCTION PDAMEDATOS(refcursor).....

--Esto sería la llamada
SELECT * FROM PDAMEDATOS('micursor');
FETCH ALL IN micursor
Muy bien, en el caso anteriormente expuesto no tengo problemas, recibo datos sin ningún problema.

Sin embargo, con esta función que he puesto en el primer POST sigo con los problemas, tal y como vi en tu página estoy haciendo la llamada de las siguientes maneras:
Código:
--Manera 1
BEGIN;
SELECT * from pdameusuario(777777-X', 'miclave');
FETCH ALL IN "<unnamed cursor 1>";
COMMIT;

--Manera 2
BEGIN;
SELECT pdameusuario(777777-X', 'miclave');
FETCH ALL IN "<unnamed cursor 1>";
COMMIT;

--Manera 3
BEGIN;
SELECT * from  pdameusuario(777777-X', 'miclave');
FETCH ALL IN "<unnamed portal 45>";
COMMIT;

La cuestión es, que si solo ejecuto:
Código:
SELECT * from  pdameusuario(7777777-X', 'miclave');
Recibo lo siguiente: "<unnamed portal 46>"

Y cada vez que lo ejecuto, va subiendo un valor: "<unnamed portal 47>", etc..., de ahi he puesto la "Manera 3", creo que es la que por el mejor camino voy, pero... todavía no soy capaz de recuperar el registro.

Como he dicho al principio, se como recuperar cursores, cuando son pasados como parametro, pero en este caso... se me está complicando un poco.
__________________
Charlie.
  #4 (permalink)  
Antiguo 11/12/2007, 04:03
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Que falla en este Procedimiento Almacenado ?

Cita:
Buenas de nuevo Foreros.

En primer lugar, agradecerte nuevamente Seyko por tu ayuda, muchos de los avances que he hecho han sido gracias a tu respuestas, asi que no esta de mas ser agradecido, por lo que reitero mis agradecimientos.
De nada, yo también aprendo mucho con vuestras dudas, porque asi pruebo cosas nuevas que no conozco!
Por ejemplo, nunca he hecho esto y he estado mirando y....

primero el retorno del procedimiento debería ser un REFCURSOR y no un SETOF REFCURSOR, porque solo vas a devolver un cursor, no?

BEGIN
SELECT pdameusuario(777777-X', 'miclave');
FETCH ALL IN "<unnamed portal 1>";
COMMIT;

Con esto debería funcionar.

Cita:
Y cada vez que lo ejecuto, va subiendo un valor: "<unnamed portal 47>", etc..., de ahi he puesto la "Manera 3", creo que es la que por el mejor camino voy, pero... todavía no soy capaz de recuperar el registro.
Se incrementa porque son llamadas dentro de la misma sesion de BD.


Salud!
  #5 (permalink)  
Antiguo 11/12/2007, 12:37
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Que falla en este Procedimiento Almacenado ?

Buenas gente, ya está solucionado. Mas o menos ha sido como me ha comentado Seyko.


1 -. He quitado el SETOF de la función.
2-. He quitado el RETURN; que tenía casi al final del procedimiento.
3-. Para ejecutar el Procedimiento Almacenado y recoger los datos tuve que hacerlo de la siguiente manera:
Código:
SELECT pdameusuario('71641951-X', 'miclave');
FETCH ALL IN "<unnamed portal 7>";
Poniendo el BEGIN Y EL COMMIT; salía el siguiente error:
Código:
--EJECUTO
BEGIN
SELECT * from pdameusuario('71641951-X', 'miclave');
FETCH ALL IN "<unnamed portal 7>";
COMMIT;

--RESULTADO
ERROR: syntax error at or near "SELECT"
Estado SQL:42601
Caracter: 8

Un saludo.
__________________
Charlie.
  #6 (permalink)  
Antiguo 12/12/2007, 03:51
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Que falla en este Procedimiento Almacenado ?

no es por el BEGIN COMMIT;
es por el select * from

Salu2
  #7 (permalink)  
Antiguo 12/12/2007, 03:52
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Que falla en este Procedimiento Almacenado ?

por cierto cuando la sesion es nueva deberia empezar por <unnamed portal 1>
  #8 (permalink)  
Antiguo 12/12/2007, 04:22
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Que falla en este Procedimiento Almacenado ?

Si, es cierto, se me olvidó comentar lo de que el <unnamed portal X> va subiendo según la sesión. Pero bueno, como lo habías comentado con anterioridad no le hice demasiado hincapié.

Por cierto seyko, con npgsql (Driver para .NET) no has trabajado, ¿verdad?

Un saludo.
__________________
Charlie.
  #9 (permalink)  
Antiguo 12/12/2007, 06:17
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Que falla en este Procedimiento Almacenado ?

nop, pero prueba, que no se pierde nada

Un saludo
  #10 (permalink)  
Antiguo 14/12/2007, 04:23
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Que falla en este Procedimiento Almacenado ?

Si, si, jejeje, si es por eso, tengo algún problemilla que otro, pero ya encontré una lista de correos para desarrolladores.

Si alguien trabaja con .NET, para quien le interese aqui les dejo el enlace:
http://pgfoundry.org/mail/?group_id=1000140
__________________
Charlie.
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 21:30.