Los procedimientos almacenados son declaraciones SQL definidas por el usuario que se almacenan en una base de datos MySQL y se ejecutan bajo demanda para realizar una operación de base de datos específica. Estas subrutinas predefinidas ayudan a mover la lógica empresarial a la base de datos, lo que ofrece algunos beneficios:
- Se minimizan los viajes de ida y vuelta realizados al servidor de la base de datos por una aplicación.
- Se mejora la capacidad de mantenimiento del código, ya que diferentes aplicaciones pueden compartir el procedimiento almacenado.
- Se mejora el rendimiento de la base de datos, porque los procedimientos almacenados se compilan una vez y se ejecutan de manera muy rápida y eficiente.
En esta guía, usted:
-
Aprenda la sintaxis para crear procedimientos almacenados y declare su primer procedimiento.
-
Ejecute el procedimiento de ejemplo después de haberlo declarado.
-
Aprenda a eliminar un procedimiento cuando ya no lo necesite.
Antes de comenzar
Asegúrate de tener lo siguiente:
-
Si aún no lo ha hecho, cree una cuenta de Linode y una instancia de cómputo. Consulte nuestras guías Introducción a Linode y Creación de una instancia informática.
-
Siga nuestra guía de configuración y protección de una instancia informática para actualizar su sistema. También puede establecer la zona horaria, configurar su nombre de host, crear una cuenta de usuario limitada y fortalecer el acceso SSH.
-
Un servidor MySQL y un cliente instalado en el servidor Linode. Las guías de instalación de MySQL están disponibles para diferentes distribuciones en nuestra sección MySQL.
Preparar la base de datos
Comenzará creando una base de datos, una tabla y un usuario de muestra para acceder a la base de datos. También completará la tabla con datos de muestra con fines de prueba.
Creación de la base de datos, la tabla y el usuario
-
Inicie sesión en el servidor MySQL:
mysql -u root -pSe le pedirá que ingrese la contraseña raíz de su base de datos MySQL. Luego, pulsa Intro para continuar.
-
A continuación, verá un indicador de MySQL similar al que se muestra a continuación.
mysql > -
Ingrese el siguiente comando para crear un
test_dbbase de datos:CREATE DATABASE test_db;Salida:
Query OK, 1 row affected (0.01 sec) -
Cree un usuario de base de datos y otorgue acceso completo a
test_dbbase de datos. ReemplazarPASSWORDcon un valor único y complejo que sigue las pautas para las contraseñas de MySQL:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';Salida:
Query OK, 1 row affected (0.01 sec) -
Otorgue el
test_userprivilegios completos paratest_dbbase de datos;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';Salida:
Query OK, 1 row affected (0.01 sec) -
Privilegios de vaciado:
FLUSH PRIVILEGES;Salida:
Query OK, 0 rows affected (0.01 sec)
Rellenar la base de datos
-
A continuación, cambie a la base de datos test_db:
USE test_db;Salida:
Database changed -
Crear un
productstabla para almacenar registros de muestra:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;Salida:
Query OK, 0 rows affected (0.01 sec) -
Ahora puede agregar algunos productos a la tabla de productos ejecutando los siguientes comandos uno por uno:
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');Debería obtener el siguiente resultado después de ejecutar cada
Insertdeclaración:Query OK, 1 row affected (0.00 sec) -
Próximo. confirme si los productos de muestra se insertaron correctamente en la base de datos ejecutando
Selectcomando a continuación:SELECT * FROM products;Sus productos de muestra deben enumerarse como se muestra a continuación:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec) -
Salga del servidor MySQL.
QUIT;Salida:
Bye! -
Una vez que haya creado un
test_dbbase de datos,productstabla, untest_usery agregó algunos productos de muestra, ahora puede pasar a crear el primer procedimiento almacenado.
Creando un Procedimiento Almacenado
Sintaxis del Procedimiento Almacenado
La sintaxis básica para crear un procedimiento almacenado en la base de datos MySQL se muestra a continuación:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
El
DELIMITER &&La línea al principio le dice al servidor MySQL que trate las siguientes declaraciones SQL como una sola declaración, en lugar de ejecutarlas individualmente. Otro&&se incluye en una línea posterior para marcar el final de esta declaración. -
PROCEDURE_NAMEes donde se declara el nombre de su procedimiento almacenado. -
El nombre del procedimiento va seguido de un conjunto de paréntesis, y estos encierran los parámetros de su procedimiento. Los procedimientos almacenados admiten parámetros separados por comas y esta característica los hace más flexibles. Consulte la sección de parámetros para obtener más detalles.
-
El
BEGIN...ENDLos comandos incluyen la instrucción SQL que desea que ejecute el procedimiento almacenado. -
Al final, la sentencia
DELIMITER ;se emite de nuevo para cambiar el delimitador al valor predeterminado de;
Parámetros de procedimiento almacenado
Cada parámetro de un procedimiento tiene un tipo, un nombre y un tipo de datos, separados por espacios:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Por ejemplo, para crear un parámetro de tipo IN , llamado category , con el VARCHAR tipo de datos que tiene una longitud de 50 caracteres, use esta sintaxis:
IN category VARCHAR(50)
MySQL admite tres tipos de parámetros:
-
IN:El valor del parámetro debe ser especificado por el cliente llamante. Este valor no puede ser cambiado por el procedimiento almacenado .Por ejemplo, si pasa una variable de sesión MySQL como
INparámetro a un procedimiento, y el procedimiento modifica este valor en sus declaraciones, su variable de sesión permanecerá sin modificar después de que finalice el procedimiento. -
OUT:Este tipo de parámetro también lo especifica el programa que llama, pero su valor puede ser cambiado por el procedimiento almacenado y recuperado por el programa que llama.Tenga en cuenta que el procedimiento almacenado no puede acceder al valor inicial de una variable que se pasa como
OUTparámetro. -
INOUT:Un parámetro de este tipo combina los comportamientos deINyOUTparámetros:-
El procedimiento almacenado puede leer el valor inicial del parámetro.
-
El parámetro se puede cambiar durante la ejecución del procedimiento almacenado.
-
El valor modificado se puede devolver al programa de llamada, si el programa de llamada pasó una variable como parámetro.
-
Un ejemplo de procedimiento almacenado
Después de comprender la sintaxis básica, creemos un procedimiento almacenado simple para filtrar productos por nombre de categoría. El nombre de la categoría se proporcionará como IN parámetro.
-
Inicie sesión en el servidor MySQL usando
test_userLas credenciales de que creó al preparar la base de datos:mysql -u test_user -p -
Introduzca la contraseña del
test_usery pulsa Intro para continuar. -
Obtendrá un
mysql >oportuno. Continúe seleccionandotest_db:USE test_db;Salida:
Database changed. -
Luego, ingrese los comandos SQL a continuación para crear un
filter_by_categoryprocedimiento almacenado:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&Salida:
Query OK, 0 rows affected (0.00 sec) -
Cambia el
DELIMITERvolver a;DELIMITER ; -
Si el código para crear el procedimiento almacenado se ejecutó correctamente, ahora puede continuar con la ejecución del procedimiento almacenado.
Ejecutando un Procedimiento Almacenado
En este paso, llamaremos al procedimiento almacenado que creamos anteriormente. Seguiremos esta sintaxis básica:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Para ejecutar el
filter_by_categoryprocedimiento almacenado que creamos anteriormente, ingrese el siguiente comando:CALL filter_by_category('COMPUTER ACCESSORIES');El procedimiento almacenado ahora debería mostrar todos los productos en
COMPUTER ACCESSORIESporque hemos especificadoCOMPUTER ACCESSORIEScomo parámetro:+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) -
Del mismo modo, puede recuperar una lista de todos los productos de
ELECTRONICScategoría ejecutando el siguiente comando.CALL filter_by_category('ELECTRONICS') ;Salida:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Nuestro procedimiento almacenado funcionó como esperábamos. A continuación, aprenderemos cómo descartar los procedimientos almacenados si ya no queremos que se vuelvan a ejecutar.
Eliminación de procedimientos almacenados
Puede eliminar un procedimiento almacenado de MySQL si ya no desea usarlo o si desea volver a crearlo desde cero. La sintaxis básica para eliminar el procedimiento almacenado se muestra a continuación:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Por ejemplo, para eliminar nuestro filter_by_category procedimiento almacenado, ejecute el siguiente comando MySQL:
DROP PROCEDURE IF EXISTS filter_by_category;
Si el procedimiento almacenado existe, obtendrá el resultado que se muestra a continuación:
Query OK, 0 rows affected (0.00 sec) Eso es todo cuando se trata de crear, usar y eliminar procedimientos almacenados de MySQL.
Más información
Es posible que desee consultar los siguientes recursos para obtener información adicional sobre este tema. Si bien estos se proporcionan con la esperanza de que sean útiles, tenga en cuenta que no podemos garantizar la precisión o la puntualidad de los materiales alojados externamente.
- Trabajar con procedimientos almacenados de MySQL