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

Empezando con plpgsql, dudas basicas en SP

Estas en el tema de Empezando con plpgsql, dudas basicas en SP en el foro de PostgreSQL en Foros del Web. Buenas tardes amigos, Verán, teniendo el siguiente Procedimiento Almacenado Código: CREATE OR REPLACE FUNCTION pinsertarusuario(IN pdni bpchar, IN pnombre bpchar, IN papellido_1 bpchar, IN papellido_2 ...
  #1 (permalink)  
Antiguo 11/07/2007, 18:34
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Empezando con plpgsql, dudas basicas en SP

Buenas tardes amigos,

Verán, teniendo el siguiente Procedimiento Almacenado

Código:
CREATE OR REPLACE FUNCTION pinsertarusuario(IN pdni bpchar, IN pnombre bpchar, IN papellido_1 bpchar, IN papellido_2 bpchar, IN pfecha_nacimiento bpchar, IN pcod_provincia bpchar, IN pcod_pais bpchar, IN pciudad bpchar, IN pcodigo_postal bpchar, IN pemail bpchar, IN pclave bpchar, IN ptelefono_movil bpchar, IN pdescripcion bpchar, IN pcod_buscar integer, IN pnotificarme boolean, IN pver_todos boolean, OUT pcod_usuario integer) AS
$BODY$
BEGIN
INSERT INTO tusuarios(dni, nombre, apellido_1, apellido_2,
      fecha_nacimiento, cod_provincia, cod_pais,
      ciudad, codigo_postal, email, clave,
      telefono_movil, descripcion, cod_buscar,
      notificarme, ver_todos) 
VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16);
PCOD_USUARIO := currval('tusuarios_cod_usuario_seq');
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
¿Podrían decirme, que tengo que hacer para que despues de asignar el valor a PCOD_USUARIO, me devuelva una senencia SQL ?

Es decir, se que tengo que poner que la función devuelve un valor, pero cuando es un conjunto de datos lo que qyuiero devolver... ¿Qué valor tengo que poner al RETURNS?

Quiero que mi SP haga lo que hace, y además depsues de asignar el valor al parametro de salida, me devuelva una sentencia SQL.

Y tambien quiero que dicho SP en caso de error establezca el valor de PCOD_USUARIO a -1.

Bueno, se que son varias preguntas, pero es que estoy iniciándome y bueno... cuando me atasco la forma más rapida de solucionar mi problema es preguntando aqui.

Asi que si alguien puede solucionarme estas dos dudas se lo agradeceré enormemente.

Gracias por todo y un fuerte saludo.

PD: Gracias Seyko, como ves ya estoy dando duramente al plpgsql.
__________________
Charlie.
  #2 (permalink)  
Antiguo 12/07/2007, 05:56
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Empezando con plpgsql, dudas basicas en SP

Buenas chcma, ya veo que le vas dando fuerte!

Si te he entendido bien..., para devolver una sentencia sql, porque no devuelves un text!?
DECLARE
cadena text;
BEGIN
cadena := 'sentencia';
....
return cadena;
END



Para caso de error:
BEGIN
EXCEPTION WHEN OTHERS THEN
PCOD_USUARIO := -1
END

esta es la forma de capturar excepciones, dale un vistazo a la documentación oficial.

Un saludo
  #3 (permalink)  
Antiguo 14/07/2007, 17:50
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Empezando con plpgsql, dudas basicas en SP

Buenas de nuevo gente,

Verán estoy intentando crear este SP:
Código:
CREATE OR REPLACE FUNCTION pdameempleados(out PCODEMPLEADO integer)
AS
$BODY$
	DECLARE txtResultado text;
	BEGIN
	UPDATE templeados set nombre='clavijo' where cod_empleado=PCODEMPLEADO;
	txtResultado := 'select * from templeados';
	return txtResultado;

	EXCEPTION WHEN OTHERS THEN
		PCODEMPLEADO := -1;
	END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Bien, lo que quiero es modificar un registro, despues devolver una select de la tabla y el Parametro de salida. Ya que si ha salido mal, valdrá -1 y sino, seguirá valiendo lo mismo que al introducirlo yo.

El error que me está dando es el siguiente:
"ERROR: RETURN cannot have a parameter in function with OUT parameters at or near "txtResultado"
Estado SQL:42601
Caracter: 249"

Entiendo lo que me dice, que no puedo tener un parametro de salida en una función que devuelve un conjunto de datos. Pero... ¿Realmente no se puede o es que me falta algo?

En fin, espero puedan audarme. Un saludo.


P.D.: También quería preguntar lo siguiente, supongamos que ya tengo hecho el SP y que funciona bien. ¿Como podría llamarlo desde el ejecutor de consultas?
Estaría bien asi?
Declare pParametro integer;
pParametro := 12;
execute pdameempleados(pParametro);
print pParametro; --Para que me muestre por pantalla el valor que tiene el parametro.

¿¿¿????
__________________
Charlie.
  #4 (permalink)  
Antiguo 16/07/2007, 03:41
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Empezando con plpgsql, dudas basicas en SP

Buenas,
has declarado PCODEMPLEADO como un parametro de salida pero lo que quieres es un parametro de entrada salida.
Un saludo
  #5 (permalink)  
Antiguo 16/07/2007, 09:49
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Empezando con plpgsql, dudas basicas en SP

Buenas seyko,

Perdona por la equivocación, había cambiado eso en el pgAdminIII pero al poner el post se me olvidó.

Código:
CREATE OR REPLACE FUNCTION pdameempleados(inout PCODEMPLEADO integer)
AS
$BODY$
	DECLARE txtResultado text;
	BEGIN
	UPDATE templeados set nombre='clavijo' where cod_empleado=PCODEMPLEADO;
	txtResultado := 'select * from templeados';
	return txtResultado;

	EXCEPTION WHEN OTHERS THEN
		PCODEMPLEADO := -1;
	END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
El error que me da sigue siendo el mismo:
ERROR: RETURN cannot have a parameter in function with OUT parameters at or near "txtResultado"
Estado SQL:42601
Caracter: 249

Hay forma de tener un parametro de salida en un SP, que devuelva una consulta ?

Gracias por vuestro tiempo.
__________________
Charlie.
  #6 (permalink)  
Antiguo 17/07/2007, 01:41
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Empezando con plpgsql, dudas basicas en SP

Buenas chcma, no te habia entendido. No puedes retornar nada en una funcion con parametros de salida.
Yo lo haría con dos parametros de salida, aunque no se para que quieres la consulta.

Un saludo
  #7 (permalink)  
Antiguo 17/07/2007, 10:15
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Re: Empezando con plpgsql, dudas basicas en SP

Gracias Seyko, unicamente queria hacer eso para hacer pruebas y saber eso mismo, que cosas se pueden y cuales no se pueden hacer.

Si me permites, una última pregunta.
Si quiero llamar a una funcion que develve un conjunto de datos, la llamo asi:
select nombreFuncion(miParametro);

Ok, eso perfecto.

Ahora, si quiero llamar a una funcion que me devuelve un parametro de salida, ¿Como puedo hacer en el PgAdmin III para probar dicha funcion?

Declare miVariable integer;
miFuncion(miVariable);
print miVariable;

Asi valdría para ver el resultado de vuelta de mi parametro de salida ?
__________________
Charlie.
  #8 (permalink)  
Antiguo 18/07/2007, 02:04
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Empezando con plpgsql, dudas basicas en SP

Buenas chcma,

Se hace de la misma forma, te pongo un ejemplo con dos parametros de salida:

CREATE OR REPLACE FUNCTION ppp(in integer, out integer, out integer) AS $$
select $1+1, $1+2;
$$ LANGUAGE 'sql';


select ppp(5);

ppp
-------
(6,7)
(1 fila)


Un saludo
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 15:31.