sql >> Base de Datos >  >> RDS >> Mysql

Creación y uso de procedimientos almacenados de MySQL:un tutorial

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:

  1. 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.

  2. 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.

  3. 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

  1. Inicie sesión en el servidor MySQL:

     mysql -u root -p
    

    Se le pedirá que ingrese la contraseña raíz de su base de datos MySQL. Luego, pulsa Intro para continuar.

  2. A continuación, verá un indicador de MySQL similar al que se muestra a continuación.

    mysql >
  3. Ingrese el siguiente comando para crear un test_db base de datos:

    CREATE DATABASE test_db;
    

    Salida:

    Query OK, 1 row affected (0.01 sec)
  4. Cree un usuario de base de datos y otorgue acceso completo a test_db base de datos. Reemplazar PASSWORD con 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)
  5. Otorgue el test_user privilegios completos para test_db base de datos;

    GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
    

    Salida:

    Query OK, 1 row affected (0.01 sec)
  6. Privilegios de vaciado:

    FLUSH PRIVILEGES;
    

    Salida:

    Query OK, 0 rows affected (0.01 sec)

Rellenar la base de datos

  1. A continuación, cambie a la base de datos test_db:

    USE test_db;
    

    Salida:

    Database changed
  2. Crear un products tabla 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)
  3. 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 Insert declaración:

    Query OK, 1 row affected (0.00 sec)
  4. Próximo. confirme si los productos de muestra se insertaron correctamente en la base de datos ejecutando Select comando 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)
  5. Salga del servidor MySQL.

    QUIT;
    

    Salida:

    Bye!
  6. Una vez que haya creado un test_db base de datos, products tabla, un test_user y 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_NAME es 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...END Los 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 IN pará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 OUT parámetro.

  • INOUT :Un parámetro de este tipo combina los comportamientos de IN y OUT pará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.

  1. Inicie sesión en el servidor MySQL usando test_user Las credenciales de que creó al preparar la base de datos:

     mysql -u test_user -p
    
  2. Introduzca la contraseña del test_user y pulsa Intro para continuar.

  3. Obtendrá un mysql > oportuno. Continúe seleccionando test_db :

     USE test_db;
    

    Salida:

    Database changed.
  4. Luego, ingrese los comandos SQL a continuación para crear un filter_by_category procedimiento 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)
  5. Cambia el DELIMITER volver a ;

    DELIMITER ;
    
  6. 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_category procedimiento 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 ACCESSORIES porque hemos especificado COMPUTER ACCESSORIES como 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 ELECTRONICS categorí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