PostgreSQL - procedimiento almacenado Error

 
Vista:
sin imagen de perfil

procedimiento almacenado Error

Publicado por Iván (1 intervención) el 18/10/2016 16:21:38
Saludos a la comunidad,

Estoy practicando con los procedimientos almacenados y tengo el siguiente código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE FUNCTION SP_DamePaises
   ( IN PV_OPCION VARCHAR(10) default 'DAMETODOS',
     OUT columna1 bigint,
     OUT columna2 character(50)
   ) RETURNS setof record AS
$BODY$
begin
 IF PV_OPCION = 'DAMETODOS' THEN
   return query select pais_id, pais_nombre from pais;
 END IF;
 IF PV_OPCION = 'DAMEDOS' THEN
   return query select pais_id, pais_nombre from pais limit 2;
 END IF;
return;
end;
$BODY$
LANGUAGE 'plpgsql';
 
SELECT * FROM SP_DamePaises('DAMETODOS');

pero me sale el siguiente error

1
2
3
4
5
6
7
8
9
ERROR:  structure of query does not match function result type
DETAIL:  Returned type integer does not match expected type bigint in column 1.
CONTEXT:  PL/pgSQL function sp_damepaises31(character varying) line 4 at RETURN QUERY
********** Error **********
 
ERROR: structure of query does not match function result type
SQL state: 42804
Detail: Returned type integer does not match expected type bigint in column 1.
Context: PL/pgSQL function sp_damepaises31(character varying) line 4 at RETURN QUERY

y como se puede ver en la img que adjunto, los dos campos en cuestión son del mismo TIPO...
m06kw4qct

3

¿Qué es lo que debo hacer mal?

Gracias de antemano, cualquier comentario es aceptado ;)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

procedimiento almacenado Error

Publicado por martin (121 intervenciones) el 19/10/2016 14:40:13
Lo que te dice es que lo que retornas no es igual a lo declarado en el setof(recorset), si vas a devolver toda una estructura definida(en la db) como por ejemplo una tabla podes utilizar "setof" ejemplo, si queres que tu funcion retorne los mismos registros que tu tabla pais, tenes que poner solo: CREATE OR REPLACE FUNCTION SP_DamePaises(...) RETURNS SETOF pais
AS
etc..
y en el body con solo hacer un select all/* va a funcionar.
Si quere retornar algunas columnas,tenes que usar "TABLE"
Ejem:

FUNCTION ETC ETC.. RETURNS TABLE( pais_id integer, pais_nombre varchar(50))
y despues retornar
return query select pais_id, pais_nombre from pais;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar