Ver Mensaje Individual
  #3 (permalink)  
Antiguo 10/12/2007, 03:18
seyko
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 9 meses
Puntos: 13
Re: Que tengo mal en este Procedimiento almacenado ? 8.2

Cita:
Iniciado por chcma Ver Mensaje
Buenas tardes de nuevo.

Bueno, en realidad son dos preguntas, jejeje. Es que estoy empezando con PostgreSQL y bueno... vengo de SQL Server asi que algún que otro problemilla estoy teniendo.

Tengo un Procedimiento almacenado, el cual quiero que me devuelva unos registros de una tabla, ok, perfecto. El problema es que ademas de los registros de esa tabla, tambien quiero que me devuelva otros dos, que estan en otras dos tablas (Es decir, un simple inner join).

Los registros a recuperar son de las tablas tusuarios y tprovincias y tpaises. Pero claro, como veran en el SP la sintaxis esta mal, estoy seguro, pero.... no sé como puedo hacerlo, por eso les pido ayuda:


Código:
CREATE OR REPLACE FUNCTION PDAMEUSUARIO(IN pdni bpchar, IN pclave bpchar) RETURNS SETOF tusuarios AS
$BODY$
DECLARE reg_tabla tusuarios;
BEGIN
	FOR reg_tabla IN SELECT cod_usuario, dni, nombre, apellido_1, apellido_2, fecha_nacimiento, 
			        tusuarios.cod_provincia, tprovincias.provincia, tusuarios.cod_pais, 
			        tpaises.pais, ciudad, codigo_postal, email, clave, telefono_movil, 
				descripcion, cod_buscar, notificarme, ver_todos
			  
				FROM tusuarios
				INNER JOIN tpaises 
					ON tpaises.cod_pais = tusuarios.cod_pais
				INNER JOIN tprovincias
					ON tprovincias.cod_provincia = tusuarios.cod_provincia

				WHERE DNI=pdni
				AND   CLAVE = pclave
	LOOP
		return next reg_tabla;
	END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

La llamada es simple: select * from PDAMEUSUARIO('71641951-X', 'micarlito');


Y el error que sale cuando lo ejecuto, obivamente es:
ERROR: value too long for type character varying(2)
Estado SQL:22001
Contexto:PL/pgSQL function "pdameusuario" line 3 at for over select rows


En fin, espero me puedan resolver la duda, mi intención es (SI SE PUEDE) hacerlo sin refcursor, ya que es para programar en .NET y eso me da quebraderos de cabeza.


En fin, espero puedan ayudarme, desde ya, muchas gracias por todo.

Saludos.

En este caso el problema es que defines el registro para recorrer el cursor como un "tusuarios" pero luego le añades campos que no son de ese tipo, de ahi el fallo.