Listado completo de tutoriales

102 - Procedimientos almacenados (parámetros de entrada y salida)


Ver video

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.

Servidor de MySQL instalado en forma local.

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

Retornar