Ejercicios de procedimientos almacenados en MySQL.
Ejercicio 1: Suma de dos números
delimiter $$
drop procedure if exists uno $$
create procedure uno(in x integer, in y integer)
begin
select a+b;
end $$
delimiter ;
Ejercicio 2: Invertir una cadena
delimiter $$
drop procedure if exists dos $$
create procedure dos (in cadena varchar(255))
begin
select reverse(cadena);
end $$
delimiter ;
Ejercicio 3: Extraer el año de una fecha
delimiter $$
drop procedure if exists tres $$
create procedure tres (in fecha date)
begin
select year(fecha);
end $$
delimiter ;
Ejercicio 4: Usar el procedimiento anterior
delimiter $$
drop procedure if exists cuatro $$
create procedure cuatro (in fecha date)
begin
select dayname(fecha), monthname(fecha), tres(fecha);
end $$
delimiter ;
Ejercicio 5: Años entre dos fechas
delimiter $$
drop procedure if exists cinco $$
create procedure cinco (in fecha1 date, in fecha2 date)
begin
if fecha1 >= fecha2 then
select year(fecha1)-year(fecha2);
else
select year(fecha2)-year(fecha1);
end if;
end $$
delimiter ;
Ejercicio 6: Trienios entre dos fechas
delimiter $$
drop procedure if exists seis $$
create procedure seis (in fecha1 date, in fecha2 date)
begin
if fecha1 >= fecha2 then
select (year(fecha1)-year(fecha2))/3;
else
select (year(fecha2)-year(fecha1))/3;
end if;
end $$
delimiter ;
Ejercicio 7: Mostrar solo caracteres alfabéticos
Recorre la cadena carácter a carácter; si el carácter es alfabético (ASCII 65-90 mayúsculas, 97-122 minúsculas) lo añade al resultado, si no, añade un espacio.
delimiter $$
drop procedure if exists sieteD $$
create procedure sieteD(in cadena varchar(255), out oCadena varchar(255))
begin
declare letra int;
declare contador int;
set contador = 0;
bucleCadena: while contador <= length(cadena) do
set letra = ascii(mid(cadena,1,1));
if (letra >= 65 and letra <=90) || (letra >= 97 and letra <= 122) then
if oCadena = null then
set oCadena = mid(cadena,contador,1);
else
set oCadena = concat(oCadena,mid(cadena,contador,1));
end if;
else
if oCadena = null then
set oCadena = ' ';
else
set oCadena = concat(oCadena,' ');
end if;
end if;
set contador = contador+1;
end while bucleCadena;
end $$
delimiter $$;
Ejercicio 8: Desglose de cambio en moneda
Descompone una cantidad decimal en billetes de €50, €20, €10, €5, €2, €1 y monedas de céntimos, usando divisiones enteras y MOD.
delimiter $$
drop procedure if exists ocho $$
create procedure ocho(valor decimal(5,2))
begin
declare unCent, dosCent, cincoCent, diezCent, veinteCent, cincuentaCent, unE, dosE, cincoE, diezE, veinteE, cincuentaE integer;
set unCent = 0;
set dosCent = 0;
set cincoCent = 0;
set diezCent = 0;
set veinteCent = 0;
set cincuentaCent = 0;
set unE = 0;
set dosE = 0;
set cincoE = 0;
set diezE = 0;
set veinteE = 0;
set cincuentaE = 0;
if valor >= 50 then
set cincuentaE = valor / 50;
set valor = MOD(valor,50);
end if;
if valor >= 20 then
set veinteE = valor / 20;
set valor = MOD(valor,20);
end if;
if valor >= 10 then
set diezE = valor / 10;
set valor = MOD(valor,10);
end if;
if valor >= 5 then
set cincoE = valor / 5;
set valor = MOD(valor,5);
end if;
if valor >= 2 then
set dosE = valor / 2;
set valor = MOD(valor,2);
end if;
if valor >= 1 then
set unE = valor / 1;
set valor = MOD(valor,2);
end if;
if valor >= 0.50 then
set cincuentaCent = valor / 0.50;
set valor = MOD(valor,0.50);
end if;
if valor >= 0.20 then
set veinteCent = valor / 0.20;
set valor = MOD(valor,0.20);
end if;
if valor >= 0.10 then
set diezCent = valor / 0.10;
set valor = MOD(valor,0.10);
end if;
if valor >= 0.05 then
set cincoCent = valor / 0.05;
set valor = MOD(valor,0.05);
end if;
if valor >= 0.02 then
set dosCent = valor / 0.02;
set valor = MOD(valor,0.02);
end if;
if valor >= 0.01 then
set unCent = valor / 0.01;
set valor = MOD(valor,0.01);
end if;
select unCent, dosCent, cincoCent, diezCent, veinteCent, cincuentaCent, unE, dosE, cincoE, diezE, veinteE, cincuentaE;
end $$
delimiter ;