Listado completo de tutoriales
102 - Procedimientos almacenados (parámetros de entrada y salida) |
La tercer forma de definir un parámetro en un procedimiento almacenado en MySQL es definirlo de entrada y salida en forma simultanea.
Definimos un parámetro de entrada y salida mediante la palabra clave inout:
create procedure NOMBREPROCEDIMIENTO (inout NOMBREPARAMETRO TIPODEDATO) begin end
Como ejemplo implementaremos un procedimiento almacenado que reciba un parámetro de entrada/salida con un entero y lo retorne incrementado en 1:
drop procedure if exists pa_incrementar; delimiter // create procedure pa_incrementar( inout contador int) begin set contador = contador + 1; end // delimiter ; set @conta=1; select @conta; -- se imprime un 1 call pa_incrementar(@conta); select @conta; -- se imprime un 2 call pa_incrementar(@conta); select @conta; -- se imprime un 3 call pa_incrementar(@conta); select @conta; -- se imprime un 4 call pa_incrementar(@conta); select @conta; -- se imprime un 5
Como vemos dentro del procedimiento almacenado modificamos el parámetro contador almacenando el valor actual más 1:
set contador = contador + 1;
Cuando se llama al procedimiento almacenado debemos tener cuidado de pasar una variable ya inicializada:
set @conta=1; select @conta; call pa_incrementar(@conta); select @conta;
La variable @conta se inicia con el valor 1 y luego de ejecutarse el procedimiento 'pa_incrementar' la variable @conta almacena el valor 2.
Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:
-- Eliminamos la tabla, si existe y la creamos:
drop table if exists empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos int,
seccion varchar(20),
primary key(documento)
);
-- Ingrese algunos registros:
insert into empleados values('22222222','Juan','Perez',300,2,'Contaduria');
insert into empleados values('22333333','Luis','Lopez',700,0,'Contaduria');
insert into empleados values ('22444444','Marta','Perez',500,1,'Sistemas');
insert into empleados values('22555555','Susana','Garcia',400,2,'Secretaria');
insert into empleados values('22666666','Jose Maria','Morales',1200,3,'Secretaria');
drop procedure if exists pa_cantidad_hijos;
-- Creamos un procedimiento que recibe un número de documento y un entero
-- como parámetro de entrada y salida
delimiter //
create procedure pa_cantidad_hijos(
in p_documento char(8),
inout cantidad int)
begin
select cantidadhijos+cantidad into cantidad
from empleados
where documento=p_documento;
end //
delimiter ;
-- Iniciamos un acumulador en cero
set @cant=0;
-- Calculamos la cantidad de hijos que tiene '22222222'
call pa_cantidad_hijos('22222222',@cant);
select @cant; -- muestra un 2
-- Acumulamos en @cant la cantidad de hijos de '22222222' y '22666666'
call pa_cantidad_hijos('22666666',@cant);
select @cant; -- muestra un 5