Programación de bases de datos

Las bases de datos se gestionan generalmente a través de un lenguaje de bases de datos, como SQL, sin embargo, muchos usuarios deben poder interactuar con los datos desde la abstracción hacia lo que va más allá de una sencilla interfaz.

Con este fin es usual el diseño de un programa que conecte ambos aspectos, se hace a través de las ampliaciones del lenguaje SQL y son las siguientes (en base a su ejecución):

  • Procedimientos almacenados: Se ejecuta con una llamada (call / exec) al servidor indicando el nombre del procedimiento y pasándole, si es necesario, parámetros de entrada.
  • Funciones definidas por el usuario: Se integran como parte de una expresión en las sentencias SQL, no requieren llamada.
  • Disparadores (triggers): Está asociado a una operación de manipulación de datos y su ejecución es automática al realizar la operación.
  • Eventos: En la creación del evento se define cuando debe ser ejecutado, cuando llega el momento, el servidor se encarga de la ejecución.

Antes de comenzar, debemos conocer unas sentencias de uso general relativas al manejo de variables y manipuladores:

Declaración de variables: permite declarar variables de uso local, su sintaxis es:

DECLARE nombre_variable tipo_dato [DEFAULT valor];

ejemplo:
DECLARE edad int DEFAULT 18;

En los programas almacenados se pueden utilizar variables de tres tipos, locales, de usuario y de sistema, la diferencia está en la semántica de declaración y llamado:

-- Variables locales (se suelen identificar con una v)
SET vEdad = 12;
-- Variables de usuario
SET @edad = 12;  // select @edad := @edad + 1;
-- Variables de sistema
SET session @@foreign_key_checks = 0;

Otra manera de asignar valores a las variables es tomando como entrada el resultado de una sentencia «select…into». Permite almacenar en una variable los valores de las columnas del resultado, siempre que esta devuelva una sola fila.

set @prueba = 'x';
select @numero := 0;
select sexo into @prueba from empresa.empleado where DNI = '44662718G';
select @prueba, @numero:=@numero+1;  

Estructuras de control de flujo:

Como cualquier lenguaje de programación, SQL permite el uso de estructuras iterativas para controlar el flujo de los programas.

Sentencia if: permite seleccionar qué sentencias se ejecutan en base a la veracidad de una condición.

drop procedure if exists evaluaNumero;

create procedure evaluaNumero()
begin
declare vNumero integer;
set vNumero = 92;
if vNumero % 2 = 0 then 
   if vNumero % 10 = 0 then select 'Número par y múltiplo de 10';
   else select 'Número par que no es múltiplo de 10'
   end if;
else select 'Número impar';
end if;
end;

call evaluaNumero();

Es posible realizar operaciones con variables

drop procedure if exists sumaNumeros;
delimiter //
create procedure sumaNumeros()
begin
declare vNum1 integer;
declare vNum2 integer;
set vNum1 = 3;
set vNum2 = 5;
select vNum1+vNum2;
end;
//

delimiter ;
call sumaNumeros();

Estructura de control de flujo CASE, se utiliza cuando el flujo se topa con una elección múltiple finita.

delimiter //
create procedure demoCase()
begin
declare vSexo char(1) default null;
set vSexo = 'm';
case vSexo
 when 'h' then select 'hombre';
 when 'm' then select 'mujer';
 else select 'error';
end case;
end;
//
delimiter ;
call demoCase();
drop procedure demoCase;

En el caso de no conocer la cantidad de veces que debemos ejecutar una secuencia de código pero conocer la condición bajo la que debe detenerse el bucle, podemos recurrir a las sentencias REPEAT o WHILE:

-- Utilizando REPEAT

drop procedure if exists suma100repeat;

delimiter //
create procedure suma100repeat()
 begin
 declare vNumero tinyint default 1;
 declare vSuma smallint unsigned default 0;
 repeat
 set vSuma = vSuma + vNumero;
set vNumero = vNumero+1;
 until vNumero > 100
 end repeat;
 select vNumero,vSuma;
 end;
//
delimiter ;
call suma100repeat();

-- Utilizando WHILE

-- suma de los 100 primeros números naturales
drop procedure if exists suma100;
delimiter //
create procedure suma100()
 begin
 declare vNumero tinyint default 1;
 declare vSuma smallint unsigned default 0;
 bucle: while (vNumero <= 100) do
 set vSuma = vSuma + vNumero;
set vNumero = vNumero+1;
 end while bucle;
 select vNumero, vSuma;
 end;
//
delimiter ;
call suma100();

Procedimientos almacenados.

Los procedimientos almacenados pueden contener una o más sentencias para realizar la función, en el caso de contener varias sentencias, estas se pueden agrupar en bloques de programación, también llamados sentencias compuestas, estos bloques suelen presentar la siguiente estructura:

BEGIN
[lista de sentencias]
END

Donde la lista de sentencias es un conjunto de sentencias SQL, en el caso de que el programa estuviese compuesto de una sola sentencia, no sería necesario definir el comienzo y el final, si se declaran, estas etiquetas permiten referenciar a ese bloque desde cualquier parte del programa.

Las sentencias terminan en punto y coma (» ; «).

* En desuso: en caso de querer definir otro delimitador que punto y coma -> delimiter

create procedure holaMundo()
BEGIN
select 'Hola mundo';
END

Es posible que alguna rutina requiera el uso de algún dato, estos datos se conocen como parámetros de entrada, del mismo modo es posible que la rutina devuelva algún parámetro de salida.

¿Te ha resultado útil?

Promedio de puntuación 5 / 5. Recuento de votos: 1

Deja una respuesta