Revista Informática

Crear un procedimiento en MySQL (PROCEDURE)

Publicado el 13 junio 2014 por Jamesrevelo @herprogramacion
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.
MySQL CREATE 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. 
Por que usar procedimientos?
  • 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.

Como creo un procedimiento?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.
No entiendo eso de "parámetros", me explicas?Claro!, 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} ] nombreTipoDeDato
Que son los atributos del procedimiento?Son características adicionales para establecer la naturaleza del procedimiento. Veamos la utilidad de algunas:
LANGUAGE SQL 
Indica que el procedimiento se escribirá en lenguaje estándar SQL/PSM. Pero su utilidad se basa en la suposición de que en el futuro los procedimientos podrían ser escritos en otros lenguajes como Php, Java, etc. Ya que aun los escribimos en SQL entonces no es necesario ponerlo.
SQL SECURITY {DEFINER|INVOKER} 
Establece el nivel de seguridad de invocación de un procedimiento. Si usas DEFINER el procedimiento sera ejecutado con los permisos del usuario que lo creó, y si usas INVOKER será ejecutado con los permisos del usuario que lo esta invocando.
[NOT] DETERMINISTIC
Especifica si el procedimiento devolverá siempre el mismo resultado al ingresar los mismo parámetros. O si devolverá distintos resultados al ingresar los mismo resultados. Un ejemplo sería ingresar la suma 1+2, se sabe que siempre el resultado será 3, así que usamos DETERMINISTIC. Pero si el parámetro es un valor de un retiro de cuenta bancaria, el resultado del saldo que queda será diferente sin importar la cantidad retirada.
NO SQL|CONTAINS SQL|READS SQL DATA|MODIFIES SQL DATA 
Estas características determinan la estructura del procedimiento. NO SQL indica que el procedimiento no contiene sentencias del lenguaje SQL. READS SQL DATA especifica que el procedimiento lee información de la base de datos mas no escribe datos. MODIFIES SQL DATA indica que el procedimiento escribe datos en la base de datos. CONTAINS SQL es el tipo por defecto de un procedimiento e indica que el procedimiento contiene sentencias SQL
COMMENT cadena
Con este atributo podemos añadir una descripción al procedimiento con respecto a las instrucciones que ejecuta. Por ejemplo,"Este procedimiento da de baja a todos los clientes que hace 3 meses no compran a la compañía". La descripción la podremos ver con el comando SHOW.

Puedes mostrarme un ejemplo?Por supuesto! Desarrollemos un procedimiento para el siguiente requerimiento:
Imprima los números del 1 hasta n, donde n esta dado por el usuario.

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 de ';'.
Y 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:
MySQL PROCEDURE resultados
James Revelo Urrea - Desarrollador independiente

Volver a la Portada de Logo Paperblog