Listado completo de tutoriales
101 - Procedimientos almacenados (parámetros de salida) |
Dijimos que los procedimientos almacenados pueden devolver información; para ello se emplean parámetros de salida. El valor se retorna a quien realizó la llamada con parámetros de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la palabra clave "out" al crear el procedimiento:
create procedure NOMBREPROCEDIMIENTO (out NOMBREPARAMETRO TIPODEDATO) begin end
Como ejemplo implementaremos un procedimiento almacenado que le enviemos dos enteros y nos retorne el promedio de dichos valores:
drop procedure if exists pa_promedio; delimiter // create procedure pa_promedio( in n1 float, in n2 float, out resultado float) begin select (n1+n2)/2 into resultado; end // delimiter ; call pa_promedio(10, 5, @resu); select @resu;
El procedimiento almacenado tiene tres parámetros, los dos primeros son de entrada y el último es de salida. Mediante un select calculamos el promedio de los parámetros n1 y n2, guardamos en el parámetro 'resultado' el promedio de los dos primeros parámetros.
Cuando llamamos al procedimiento almacenado debemos pasar dos valores numéricos y como último dato una variable donde se almacene el resultado:
call pa_promedio(10, 5, @resu);
Luego imprimimos el valor almacenado en la variable @resu:
select @resu;
Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:
drop table if exists libros; create table libros( codigo int auto_increment, titulo varchar(40), autor varchar(30), editorial varchar(20), precio decimal(5,2), primary key(codigo) ); insert into libros (titulo,autor,editorial,precio) values ('Uno','Richard Bach','Planeta',15); insert into libros (titulo,autor,editorial,precio) values ('Ilusiones','Richard Bach','Planeta',12); insert into libros (titulo,autor,editorial,precio) values ('El aleph','Borges','Emece',25); insert into libros (titulo,autor,editorial,precio) values ('Aprenda PHP','Mario Molina','Nuevo siglo',50); insert into libros (titulo,autor,editorial,precio) values ('Matematica estas ahi','Paenza','Nuevo siglo',18); insert into libros (titulo,autor,editorial,precio) values ('Puente al infinito','Bach Richard','Sudamericana',14); insert into libros (titulo,autor,editorial,precio) values ('Antología','Borges','Paidos',24); insert into libros (titulo,autor,editorial,precio) values ('Java en 10 minutos','Mario Molina','Siglo XXI',45); insert into libros (titulo,autor,editorial,precio) values ('Cervantes y el quijote','Borges- Casares','Planeta',34); drop procedure if exists pa_autor_sumaypromedio; -- creamos un procedimiento almacenado que recibe el nombre de un autor -- y nos retorna la suma de precios de todos sus libros y su promedio delimiter // create procedure pa_autor_sumaypromedio( in p_autor varchar(30), out suma decimal(6,2), out promedio decimal(6,2)) begin select titulo,editorial,precio from libros where autor=p_autor; select sum(precio) into suma from libros where autor=p_autor; select avg(precio) into promedio from libros where autor=p_autor; end; // delimiter ; -- Llamamos al procedimiento almacenado que nos retorna la suma de precios -- de todos los libros y su promedio del autor 'Richard Bach' call pa_autor_sumaypromedio('Richard Bach', @s,@p); select @s, @p; call pa_autor_sumaypromedio('Borges', @s,@p); select @s, @p;