Nota: Traducido de la versión original en Inglés.
MariaDB 11.4 introdujo muchas características avanzadas. Una que llamó mi atención es el soporte general de paquetes para rutinas almacenadas. Aunque esto estaba disponible antes activando el modo de compatibilidad con Oracle, ahora la función está disponible de forma general y predeterminada. Esto ayudará a mejorar significativamente la organización del desarrollo de bases de datos dentro de un entorno MariaDB. Los paquetes proporcionan un enfoque modular para gestionar la lógica de la base de datos. Esta adición alinea a MariaDB más estrechamente con otros sistemas avanzados de bases de datos que han utilizado paquetes durante mucho tiempo, como Oracle, y la distingue en ese sentido de otras bases de datos relacionales de código abierto que no soportan paquetes.
En MariaDB, los paquetes te permiten agrupar en una sola unidad procedimientos almacenados, funciones, variables y otros elementos que están relacionados. Esta estructura proporciona varios beneficios incluyendo una mejor organización del código, mayor reutilización y mantenimiento simplificado. Antes de esta actualización, cada procedimiento y función almacenada en MariaDB existía de forma independiente, lo que podía llevar a esquemas desordenados y gestión un tanto complicada de lógica de negocios compleja cuando ésta se implementa en la base de datos. Los paquetes abordan este problema proporcionando una forma de agrupar lógicamente rutinas relacionadas.
De nuevo, la principal ventaja de usar paquetes es la encapsulación de rutinas relacionadas. Por ejemplo, en una aplicación de comercio electrónico, las operaciones relacionadas con el procesamiento de pedidos pueden agruparse en un solo paquete llamado OrderProcessing
. Este paquete podría incluir procedimientos como PlaceOrder
, CancelOrder
y UpdateOrderStatus
, así como funciones como GetOrderDetails
. Este agrupamiento lógico hace que el esquema de la base de datos esté más organizado y el código más fácil de navegar y, por lo tanto, de mantener.
Creando paquetes#
Crear y usar paquetes en MariaDB 11.4 y versiones posteriores es sencillo. Simplemente usa la sentencia CREATE PACKAGE
para definir un paquete y la sentencia CREATE PACKAGE BODY
para implementar las rutinas del paquete. Este es un ejemplo simplificado (sin la implementación real de la lógica de negocios):
DELIMITER $$
CREATE OR REPLACE PACKAGE OrderProcessing
PROCEDURE PlaceOrder(customer_id INT, product_id INT, quantity INT);
PROCEDURE CancelOrder(order_id INT);
FUNCTION GetOrderDetails(order_id INT) RETURNS JSON;
END;
CREATE OR REPLACE PACKAGE BODY OrderProcessing
PROCEDURE PlaceOrder(customer_id INT, product_id INT, quantity INT)
BEGIN
-- Código de implementación aquí
END;
PROCEDURE CancelOrder(order_id INT)
BEGIN
-- Código de implementación aquí
END;
FUNCTION GetOrderDetails(order_id INT) RETURNS JSON
BEGIN
-- Código de implementación aquí
END;
END;
$$
DELIMITER ;
En este ejemplo, el paquete OrderProcessing
se define con dos procedimientos y una función. El cuerpo del paquete proporciona la implementación de estas rutinas, encapsulando la lógica relacionada con el procesamiento de pedidos dentro de un solo paquete.
Llamando a rutinas almacenadas en paquetes#
Para llamar a un procedimiento o función que fue definido en un paquete, usa la “notación punto”. Este es un ejemplo de cómo llamar al procedimiento CancelOrder
del paquete OrderProcessing
:
CALL OrderProcessing.CancelOrder(7);
Lo mismo aplica a funciones en paquetes:
SELECT OrderProcessing.GetOrderDetails(7);
También puedes definir variables y constantes a nivel de paquete, que son accesibles para todas las rutinas dentro del paquete. De esta manera, puedes compartir datos comunes sin depender de variables globales o pasar parámetros entre rutinas. Al gestionar centralmente los datos compartidos dentro del paquete, reduces la duplicación de código y minimizas el riesgo de errores. El siguiente es un ejemplo (no tomes los nombres de las variables demasiado en serio en este fragmento de código):
DELIMITER $$
CREATE OR REPLACE PACKAGE OrderProcessing
-- Lista de procedimientos (ver ejemplo anterior)
END;
CREATE OR REPLACE PACKAGE BODY OrderProcessing
-- Declaraciones de variables
DECLARE some_count INT DEFAULT 1;
DECLARE some_total INT DEFAULT 0;
-- Definiciones de procedimientos (ver ejemplo anterior)
END;
$$
DELIMITER ;
Otros beneficios de los paquetes#
La introducción de paquetes en MariaDB 11.4 también trae la posibilidad de un mejor control de versiones y modularización de código. Ahora puedes gestionar las rutinas almacenadas de manera más efectiva, haciendo que sea más fácil rastrear cambios y actualizaciones. Esta modularización es particularmente beneficiosa en proyectos grandes, donde múltiples desarrolladores podrían estar trabajando simultáneamente en diferentes partes de la lógica de la base de datos. Al aislar diferentes funcionalidades en paquetes, se pueden minimizar los conflictos y solapamientos, lo que lleva a un proceso de desarrollo más fluido.
Además, los paquetes soportan declaraciones anticipadas, lo que significa que las rutinas pueden definirse antes de su implementación real. Esta característica permite un enfoque más flexible y estructurado para la codificación, en el que los desarrolladores pueden delinear la interfaz del paquete primero y luego llenar los detalles. Esta separación de interfaz e implementación puede llevar a un código más limpio y comprensible, facilitando la colaboración y reduciendo la curva de aprendizaje para nuevos desarrolladores que se unan a un proyecto.
Para desarrolladores acostumbrados a trabajar con bases de datos Oracle, la inclusión de paquetes en MariaDB 11.4 resultará familiar y bienvenida. Cierra una brecha funcional entre MariaDB y Oracle, haciendo que sea más fácil cambiar entre estas plataformas.
Paquetes vs múltiples esquemas#
Es importante notar la distinción entre paquetes y el simple uso de múltiples esquemas de base de datos. Mientras que múltiples esquemas pueden ayudar a segregar diferentes partes de una base de datos, no ofrecen el mismo nivel de organización y encapsulación que los paquetes. Los esquemas son útiles para dividir áreas distintas de datos y lógica, pero no agrupan inherentemente procedimientos y funciones relacionados de una manera que mejore la modularidad y mantenibilidad. Los paquetes, por otro lado, permiten un enfoque más granular y cohesivo, agrupando la lógica relacionada dentro del mismo esquema. Esto no solo simplifica la gestión de rutinas, sino que también mejora la claridad y mantenibilidad del código.
Pruébalo#
Como siempre, MariaDB sigue evolucionando. Pruébalo hoy descargando la última versión de MariaDB, o si tienes Docker corriendo:
docker run --name mariadb-11.4 -e MARIADB_ROOT_PASSWORD=my-secret-pw -e MARIADB_DATABASE=mydb -e MARIADB_USER=myuser -e MARIADB_PASSWORD=mypassword -d mariadb:11.4
docker exec -it mariadb-11.4 mariadb -p"mypassword"