Vous êtes sur la page 1sur 17

Sql procedural

Unidad 5
Procedimientos almacenados
 Un procedimiento almacenado es un conjunto de comandos SQL
que pueden almacenarse en el servidor.
 Una vez que se hace, los clientes no necesitan relanzar los
comandos individuales pero pueden en su lugar referirse al
procedimiento almacenado.
 Pueden mejorar el rendimiento ya que se necesita enviar menos
información entre el servidor y el cliente.
 El intercambio que hay es que aumenta la carga del servidor de
la base de datos ya que la mayoría del trabajo se realiza en la
parte del servidor y no en el cliente.
 Permiten tener bibliotecas o funciones en el servidor de base
de datos. Esta característica es compartida por los lenguajes de
programación modernos que permiten este diseño interno, por
ejemplo, usando clases.
Su utilidad principal:
 Cuando múltiples aplicaciones cliente se escriben en
distintos lenguajes o funcionan en distintas plataformas,
pero necesitan realizar la misma operación en la base de
datos.
 Cuando la seguridad es muy importante. Los bancos, por
ejemplo, usan procedimientos almacenados para todas las
oparaciones comunes.
 Esto proporciona un entorno seguro y consistente, y los
procedimientos pueden asegurar que cada operación se
loguea apropiadamente.
 En tal entorno, las aplicaciones y los usuarios no obtendrían
ningún acceso directo a las tablas de la base de datos, sólo
pueden ejectuar algunos procedimientos almacenados.
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, el cuerpo del procedimiento es un bloque de
instrucciones definido.
Parámetros de Entrada y Salida

 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 indicamos el tipo de parámetro MySQL
asigna IN.
Sintaxis para especificar el tipo de parámetro:
[{IN|OUT|INOUT} ] nombre TipoDeDato

Atributos de un Procedimiento en MySQL

LANGUAGE SQL: Indica que el procedimiento se escribirá en lenguaje estándar.


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 será
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 parámetros.
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.
 CONTAINS SQL es el tipo por defecto de un procedimiento e indica que el
procedimiento contiene sentencias 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.
 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 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.
 El comando CALL enseguida el nombre del procedimiento y si tiene
parámetros, entonces se ingresan sus parámetros para llamar un
procedimiento.
Ejemplo:
DELIMITER //

CREATE PROCEDURE numeros_serie (IN n INT)


BEGIN
DECLARE contador INT DEFAULT 1;
WHILE contador<=n DO
SELECT contador;
SET contador = contador + 1 ;
END WHILE;
END//

DELIMITER ;
 Llamar a un procedimiento
CALL nombre Procedimiento(parametro);
 Modificar un Procedimientos en MySQL
ALTER PROCEDURE nombre
[SQL SECURITY {DEFINER|INVOKER}]
[COMMENT descripción]
 Borrar un Procedimiento
DROP PROCEDURE [IF EXISTS] nombre_procedimiento;
 Mostrar un Procedimiento
SHOW CREATE PROCEDURE;
SHOW CREATE PROCEDURE nombre_procedimiento;
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 ;
Disparadores

Un disparador es un objeto con nombre dentro de


una base de datos el cual se asocia con una tabla
y se activa cuando ocurre en ésta un evento en
particular.
Por ejemplo, las siguientes sentencias crean una
tabla y un disparador para sentencias
DISPARADORES (Triggers)

 Sintaxis:

CREATE TRIGGER nombre_trigger BEFORE|AFTER INSERT|UPDATE|DELETE


ON nombre_tabla
FOR EACH ROW
BEGIN
Funcion_del_Trigger
 DONDE:
 CREATE TRIGGER= instrucción para crear el trigger
 nombre_trigger= nombre que se le desee dar al trigger
 BEFORE, AFTER = representa la forma de ejecución Antes o Después
 INSERT, UPDATE, DELETE = función en la que se ejecutará dicho trigger, (Antes o
Después de realizar una inserción, modificación o eliminación.
 Nombre_tabla = Nombre de la tabla sobre la que tendrá acción el Trigger.
 FOR EACH ROW = Sintaxis de default, para decir que tendrá ejecución para cada
uno de los datos de la fila.
 BEGIN = Indica el comienzo de la acción, esta instrucción varía dependiendo de la
versión de mysql, en versiones antiguas a la versión 5.1 se usa esta instrucción, y
en versiones posteriores, se omite.
 Funcion_del_Trigger = La tarea que realizará dicho trigger.

 En la parte de Funcion_del_Trigger suelen manejar palabras como: NEW. Y OLD.


Eso hace referencia a la captura de un dato Nuevo o uno Viejo.
Ejemplo:

INSERT dentro de la tabla.


El disparador suma los valores insertados en una de las columnas de la
tabla.

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH


ROW SET @sum = @sum + NEW.amount

SET @sum = 0;
INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
SELECT @sum AS 'Total amount inserted';
Para eliminar un disparador

DROP TRIGGER account.ins_sum;