Procedimientos almacenados

Un **procedimiento** es un conjunto de instrucciones que se guardan en el **servidor** para un posterior uso, ya que se ejecutarán frecuentemente. En **MySQL** se nombran con la clausula `PROCEDURE`.

A diferencia de las **funciones**, los procedimientos son **rutinas** que no retornan en ningún tipo de valor. Simplemente se llaman desde el **cliente** con un comando y las instrucciones dentro del procedimiento se ejecutarán.

Ventajas De Usar Procedimientos En MySQL

* **Seguridad**: Los procedimientos ocultan el nombre de las tablas a usuarios que no tengan los privilegios para manipular datos. Simplemente llaman los procedimientos sin conocer la estructura de la **base de datos**.
* **Estándares de código**: En un equipo de desarrollo usar el mismo procedimiento permite crear sinergia en las fases de construcción. Si cada programador crea su propio procedimiento para realizar la misma tarea, entonces podrían existir problemas de integridad y perdida de tiempo
* **Velocidad**: Es mucho mas fácil ejecutar un programa ya definido mediante ciertos parámetros, que reescribir de nuevo las instrucciones.

Crear Un Procedimiento En MySQL

La creación de un procedimiento se inicia con las clausulas `CREATE PROCEDURE`. Luego definimos un nombre y los parámetros que necesita para funcionar adecuadamente. Veamos su sintaxis:

```
CREATE PROCEDURE nombre ([parámetro1,parámetro2,...])
[Atributos de la rutina]
BEGIN instrucciones
END

```

Un procedimiento puede tener uno o mas parámetros o también no tener ninguno. Puede carecer de atributos o puede poseer varios. Y como ves, el cuerpo del procedimiento es un **bloque de instrucciones**definido.

## Parámetros De Entrada Y Salida En Un Procedimiento

Un parámetro es un dato necesario para el funcionamiento del procedimiento, ya que contribuyen al correcto desarrollo de las instrucciones del bloque de instrucciones.

Los parámetros pueden ser de entrada (`IN`), salida (`OUT`) o entrada/salida (`INOUT`) y deben tener definido un tipo. Un parámetro de entrada en un dato que debe ser introducido en la llamada del procedimiento para definir alguna acción del bloque de instrucciones.

Un parámetro de salida es un espacio de memoria en el cual el procedimiento devolverá almacenado su resultado. Y un parámetro de **entrada/salida** contribuye tanto como a ingresar información útil como para almacenar los resultados del procedimiento. Por defecto, si no indicas el tipo de parámetro MySQL asigna `IN`.

Para especificar el tipo de parámetro seguimos la siguiente sintaxis:

```
  [{IN|OUT|INOUT} ] nombre TipoDeDato

```

## Atributos De Un Procedimiento En MySQL

Son características adicionales para establecer la naturaleza del procedimiento. Veamos la utilidad de algunas:

## Ejemplo De Un Procedimiento Con Un Parámetro IN

En el siguiente ejemplo desarrollemos un procedimiento para el siguiente requerimiento:

Usaremos un procedimiento para capturar el numero n del usuario. Incorporaremos una variable contadora que comience en 1 y un **WHILE** para el incremento e impresión. Veamos:

```
DELIMITER //

CREATE PROCEDURE numeros_1_hasta_n (IN n INT)
BEGIN
DECLARE contador INT DEFAULT 1;
WHILE contador<=n DO
SELECT contador;
SET contador = contador + 1 ;
END WHILE;
END//

DELIMITER ;

```

La sentencia `DELIMITER` cambia el carácter de terminación `';'` por cualquier otro carácter, en este caso elegimos `'//'`. Se hace con el fin de que **MySQL** no termine el procedimiento al encontrar el primer punto y coma. Al final restablecemos el valor original del caracter de escape.

## ¿Como Ejecuto Un Procedimiento Ya Almacenado?

Usaremos el comando `CALL` enseguida del nombre del procedimiento y si tiene parámetros, entonces se ingresan sus parámetros. Ahora veamos como llamar al anterior procedimiento:

```
CALL numeros_1_hasta_n(5)

```

Veamos el resultado:

## Modificar Un Procedimientos En MySQL

Para modificar un procedimiento en **MySQL** usaremos la sentencia `ALTER PROCEDURE`. Esta modificación permite cambiar el **nivel de seguridad** y la **descripción del procedimiento**.

```
ALTER PROCEDURE nombre
[SQL SECURITY {DEFINER|INVOKER}]
[COMMENT descripción]

```

## Ejemplo: Cambiar La Descripción De Un Procedimiento

A continuación mostraremos un procedimiento que inserta un cliente en la **base de datos**.

```
DELIMITER //
CREATE PROCEDURE insertar(id_cliente INT, nombre_cliente VARCHAR(100), apellido_cliente VARCHAR(100))
COMMENT 'Procedimiento que inserta un cliente a la base de datos'
BEGIN
IF NOT EXISTS ( SELECT C.ID
FROM CLIENTE AS C
WHERE C.ID = id_cliente) THEN
INSERT INTO CLIENTE(ID, NOMBRE, APELLIDO)
VALUES ( id_cliente,nombre_cliente,apellido_cliente);
ELSE
SELECT 'Este cliente ya existe en la base de datos!';
END IF;
END//

DELIMITER ;

```

Ahora le cambiaremos la descripción mediante `ALTER PROCEDURE`:

```
ALTER PROCEDURE insertar_cliente
COMMENT 'Insertar Cliente'

```

## Borrar Un Procedimiento En MySQL

La sentencia `DROP` permite borrar un **procedimiento** de **MySQL**. Obviamente el procedimiento debe estar almacenado con anterioridad para poder llevar a cabo la operación. Dado el caso de que no se encuentre creado, podemos usar el operador **EXISTS** junto al condicional **IF** para comprobar su existencia.

```
DROP PROCEDURE [IF EXISTS] nombre_procedimiento

```

## Ejemplo: Eliminar Un Procedimiento Antes De Crearlo

La eliminación de un procedimiento se lleva a cabo con `DROP PROCEDURE`. Es común usa esta sentencia antes de crear un procedimiento.

Como ejemplo crearemos un **procedimiento** llamado `mostrar_clientes`, el cual simplemente consulta todas las columnas de una tabla llamada `CLIENTE`:

```
DROP PROCEDURE IF EXISTS mostrar_clientes;
CREATE PROCEDURE mostrar_clientes()
SELECT * FROM CLIENTE;

```

Si el procedimiento que deseamos crear ya existe, entonces lo borraremos para darle paso a la nueva definición.

## Mostrar Un Procedimiento En MySQL

Para **mostrar las características** de un **procedimiento** en **MySQL** usaremos la sentencia `SHOW CREATE PROCEDURE`.

```
SHOW CREATE PROCEDURE nombre_procedimiento

```