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