3.5 Ejecución de procedimientos y funciones almacenadas
Introducción a procedimientos y funciones almacenadas
Los procedimientos almacenados y las funciones almacenadas son bloques de código SQL que se guardan directamente en el servidor de bases de datos. Permiten encapsular operaciones repetitivas y complejas en la base de datos, mejorando la eficiencia y reutilización del código.
-
Procedimientos almacenados: Son similares a las funciones, pero no devuelven un valor directamente. Se utilizan para realizar una serie de operaciones o modificaciones en la base de datos, como inserciones, actualizaciones o eliminaciones.
-
Funciones almacenadas: Son similares a las funciones en la programación tradicional. Devuelven un valor, lo que las hace útiles para realizar cálculos y devolver resultados dentro de una consulta SQL.
Los procedimientos almacenados y las funciones almacenadas pueden ser ejecutados desde PHP, y pueden aceptar parámetros para hacer más flexible su uso.
3.5 Ejecución de procedimientos y funciones almacenadas
3.5.1 Procedimientos almacenados
Ejemplo de un procedimiento almacenado para actualizar el salario de un empleado:
Como se ha explicado anteriormente, los procedimientos almacenados son útiles para realizar operaciones complejas en la base de datos. En este caso, vamos a crear un procedimiento almacenado que actualiza el salario de un empleado en la tabla salaries.
En este ejemplo, creamos un procedimiento almacenado que actualiza el salario del empleado en la tabla salaries y agrega un nuevo registro con la nueva fecha de inicio para ese salario.
Creación del procedimiento almacenado:
| Creación del procedimiento almacenado | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 | |
Este procedimiento actualiza el salario del empleado y mantiene el historial de salarios, marcando el salario anterior con la fecha actual y agregando un nuevo salario con fecha de inicio CURDATE().
Para ser más correcto, el procedimiento debería hacer algunas cosas más:
- Comprobar si el empleado existe en la tabla
salaries. - Crear una transacción para asegurar que ambas operaciones (actualización e inserción) se realicen correctamente. O se realizan ambas o no se realiza ninguna. Sino corremos el peligro de dejar la tabla
salariesen un estado inconsistente.
Ejemplo de procedimiento almacenado con transacción
| Procedimiento almacenado con transacción | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
ROLLBACK para deshacer los cambios.
Ejemplo de llamada al procedimiento desde PHP con MySQLi
Ejemplo de llamada a procedimiento almacenado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Ejemplo de llamada al procedimiento desde PHP con PDO:
Ejemplo de llamada a procedimiento almacenado con PDO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Se recomienda en ambos casos (MySQLi y PDO) usar sentencias preparadas para evitar inyecciones SQL. En el caso de MySQLi, se utiliza bind_param para enlazar los parámetros, mientras que en PDO se utiliza bindParam.
Hacer pruebas con diferentes valores de salario y empleados para ver que funciona correctamente, debemos utilizar también valores que produzcan errores, como un salario negativo o un id de empleado que no existe, y ver qué sucede y como controlar esos errores.
3.5.2 Funciones almacenadas
Ahora vamos a crear una función almacenada para calcular el salario promedio de todos los empleados de un departamento, usando los datos de la tabla salaries.
Creación de una función almacenada para calcular el salario promedio de un departamento:
| Creación de la función almacenada | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 | |
Este procedimiento almacenado calcula el salario promedio de un departamento, basándose en los salarios actuales de los empleados en ese departamento.
Ejemplo de llamada a la función almacenada desde PHP con MySQLi (orientado a objetos):
Ejemplo de llamada a función almacenada
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Ejemplo de llamada a la función almacenada desde PHP con PDO:
Ejemplo de llamada a función almacenada con PDO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Resumen de la sección 3.5
En esta sección hemos cubierto los siguientes temas:
- Procedimientos almacenados: Aprendimos a crear procedimientos almacenados para realizar operaciones como la actualización de salarios, y cómo invocarlos desde PHP.
- Funciones almacenadas: Aprendimos a crear funciones almacenadas que realizan cálculos como el salario promedio de un departamento, y cómo invocarlas desde PHP.
Ejercicios prácticos:
- Ejercicio 1: Crea un procedimiento almacenado para cambiar un empleado de departamento. El procedimiento debe recibir el ID del empleado y el nuevo ID del departamento, y actualizar la tabla
dept_emppara reflejar el cambio. Recuerda que debes cerrar el período anteriorUPDATEy abrir uno nuevoINSERT. Crea una prueba en PHP para invocar este procedimiento. - Ejercicio 2: Crea una función almacenada que devuelva el número de empleados de un departamento en la base de datos
employees. Crea una prueba en PHP para invocar esta función y mostrar el resultado. - Ejercicio 3: Crea una función que devuelva el ID del jefe actual de un empleado. Para ello primero debes averigual el departamento actual del empleado y luego averiguar el jefe de ese departamento. Crea una prueba en PHP para invocar esta función y mostrar el resultado.