Mejorando la eficiencia y modularidad de tus consultas SQL
Una función almacenada, también conocida como simplemente función, es un conjunto de instrucciones o bloques de código SQL que se almacenan en una base de datos y pueden ser invocados o llamados en diferentes momentos para realizar tareas específicas. Puede recibir cero o varios parámetros y siempre retorna un valor como resultado. Normalmente, se utiliza mediante una sentencia SELECT o dentro de una expresión.
Para crear una función almacenada se utiliza la sentencia CREATE FUNCTION. A continuación, se presenta un ejemplo de función creada en MySQL, la cual retornará la cantidad de días hábiles entre dos fechas (total de días sin contar fin de semana).
DELIMITER // CREATE FUNCTION CalcularDiasHabiles(fechaInicio DATE, fechaFin DATE) RETURNS INT NO SQL BEGIN DECLARE diasHabiles INT DEFAULT 0; DECLARE fechaActual DATE; SET fechaActual = fechaInicio; WHILE fechaActual <= fechaFin DO IF WEEKDAY(fechaActual) NOT IN (5, 6) THEN SET diasHabiles = diasHabiles + 1; END IF; SET fechaActual = fechaActual + INTERVAL 1 DAY; END WHILE; RETURN diasHabiles; END // DELIMITER ;
Como se puede observar, una función almacenada contiene múltiples elementos que pasaremos a detallar a continuación:
- ‘DELIMITER //’ se utiliza para cambiar el delimitador de sentencias a // en lugar del punto y coma (;) predeterminado, para permitir que la función almacenada contenga sentencias múltiples.
- ‘CREATE FUNCTION CalcularDiasHabiles(fechaInicio DATE, fechaFin DATE)’ crea la función almacenada llamada «CalcularDiasHabiles» que toma dos parámetros: «fechaInicio» y «fechaFin» de tipo DATE.
- ‘RETURNS INT’ indica que la función retornará un valor entero.
- ‘NO SQL’ indica que la función no accede a la base de datos ni modifica datos.
- ‘BEGIN’ marca el comienzo del bloque de código de la función.
- ‘DECLARE diasHabiles INT DEFAULT 0;’ declara una variable llamada «diasHabiles» de tipo entero y la inicializa en 0.
- ‘DECLARE fechaActual DATE;’ declara una variable llamada «currentDate» de tipo DATE para almacenar la fecha actual durante el bucle.
- ‘SET fechaActual = fechaInicio;’ asigna el valor de «fechaInicio» a la variable «currentDate».
- ‘WHILE fechaActual ≤ fechaFin DO’ establece un bucle mientras «currentDate» sea menor o igual que «fechaFin».
- ‘IF WEEKDAY(fechaActual) NOT IN (5, 6) THEN’ verifica si el día de la semana de «fechaActual » no es sábado (5) ni domingo (6).
- ‘SET diasHabiles = diasHabiles + 1;’ incrementa en 1 el valor de la variable «diasHabiles» si el día actual no es fin de semana.
- ‘SET currentDate = currentDate + INTERVAL 1 DAY;’ incrementa la fecha actual en un día.
- ‘END WHILE;’ marca el fin del bucle.
- ‘RETURN diasHabiles;’ devuelve el valor de la variable «diasHabiles».
- ‘END //’ marca el fin del bloque de código de la función.
- ‘DELIMITER ;’ restaura el delimitador de sentencias predeterminado (;).
Para ejecutar la función almacenada, esta se debe llamar de la siguiente forma:
SELECT CalcularDiasHabiles('2023-06-01', '2023-06-30');
Lo que devolverá un total de 22 días.
<solutionops-team> Autor: Jonathan Urrutia </solutionops-team>