Contrucción de Guiones
Contrucción de Guiones
Contrucción de Guiones
Índice
1. Introducción 2
2. Variables de usuario 3
3. Procedimientos almacenados. 3
4. Funciones 8
5. Estructuras de control 10
6. Manipuladores de error 16
7. Manejo de cursores 18
8. Disparadores o triggers 24
9. Para saber más 26
1
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
1. Introducción
Mediante SQL, como hemos estudiado, se pueden consultar datos de una base de
datos, realizar inserciones, borrados y actualizaciones. Pero además de todo esto,
este lenguaje permite la automatización de tareas, es decir, ofrece la posibilidad de
guardar bajo un nombre un grupo de sentencias que se ejecutan a menudo y hacer
referencia a ese nombre cada vez que queramos ejecutarlas.
En esta unidad se estudia la forma de crear estos bloques de código, que integran
el lenguaje SQL, con sentencias de control propias de un lenguaje de programación,
como decisiones, bucles, etc. Esto es a lo que se llama guiones, scripts, etc.
Desde el punto de vista de las bases de datos, estos guiones o scripts se llaman
procedimientos, funciones, disparadores (triggers) y cursores.
2
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
2. Variables de usuario.
Estas variables pueden ser utilizadas en cualquier lugar donde se espere una
expresión, siempre que no se espere un valor literal o constante, como tras LIMIT.
3. Procedimientos almacenados.
Sus ventajas.
- Residen en el servidor, por tanto para ser utilizados sólo es necesario que
desde el cliente se haga referencia a su nombre. Su inconveniente es que el
servidor recibe una mayor carga de trabajo.
- Permiten que aplicaciones y usuarios no accedan directamente a las tablas,
sino que se comuniquen con estas a través de los mismos. Proporcionan un
entorno de ejecución seguro.
- Agilizan las comunicaciones con el cliente.
3
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Los parámetros son datos que se le pasan al procedimiento y que este utiliza para
realizar sus cálculos.
El Tipo se utiliza para asignar un tipo de datos al parámetro. Estos tipos de datos
son los propios de MariaDB vistos en la sección de creación de tablas.
Las características:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'CadenaComentario'
- LANGUAGE SQL. Para indicar que el cuerpo del procedimiento está escrito en
lenguaje SQL y no se cuela código en otro lenguaje.
- CONTAINS. Cláusula informativa. Para indicar al servidor que el procedimiento
lee datos, modifica datos o ninguna de ellas (SQL).
4
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
DELIMITER @
CREATE PROCEDURE EMPDPTO (
IN DPTO VARCHAR(50),
IN SALARIOLIMITE DECIMAL(10,2))
BEGIN
SELECT * FROM EMPLEADOS E, DEPARTAMENTOS D WHERE
NUMERODEPARTAMENTO = DEPARTAMENTO AND D.NOMBRE=DPTO AND
SALARIO>SALARIOLIMITE;
END @
DELIMITER ;
5
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Al crear un procedimiento, el servidor puede indicar errores que este pudiera tener.
En estos casos, el procedimiento no se crea. Será necesario corregir estos errores
para que el procedimiento se cree y se guarde en la base de datos.
6
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
DELIMITER @
CREATE PROCEDURE MEDIASALARIO (IN NOMBREDEP VARCHAR(50), OUT
MEDIA DECIMAL(10,2))
BEGIN
SELECT AVG(SALARIO) INTO MEDIA FROM EMPLEADOS E, DEPARTAMENTOS D
WHERE NUMERODEPARTAMENTO=DEPARTAMENTO AND
D.NOMBRE=NOMBREDEP;
END@
DELIMITER ;
7
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
END;
Las características son las mismas que las comentadas en el punto 3.1 de esta
unidad.
Con esta sentencia sólo pueden cambiarse las características del procedimiento,
no podrán cambiarse ni los parámetros ni su código. Para cambiar estos últimos será
necesario eliminar el procedimiento y crearlo de nuevo.
4. Funciones.
Características:
8
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
En el cuerpo de la función debe incluirse de forma obligatoria una orden del tipo
RETURN expresión, siendo esta expresión del mismo tipo de datos que el devuelto
por la función (el indicado en RETURNS).
RETURN MEDIA;
END
En el ejemplo se declara una variable local, MEDIA, que será la que almacene el
dato a devolver. Su tipo de datos coincide con el indicado en RETURNS. La sentencia
SELECT hace el cálculo y guarda el resultado en esta variable: INTO MEDIA.
Finalmente, se devuelve esta variable: RETURN MEDIA.
9
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Ejemplos de llamada:
SELECT MEDIASALARIODPTO(‘NOMINAS’).
5. Estructuras de control
5.2. La sentencia IF
Con esta sentencia puede dirigirse la ejecución del programa hacia una u otra
dirección en función de una condición.
Su sintaxis:
10
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
IF SALARIOEMP<1000 THEN
UPDATE EMPLEADOS SET SALARIO=SALARIO*1.10 WHERE
NumeroEmpleado=NUM_EMP;
ELSE
UPDATE EMPLEADOS SET SALARIO=SALARIO*1.05 WHERE
NumeroEmpleado=NUM_EMP;
END IF;
END;
Ejemplo. Diseñar una función que devuelva “Más de 1000”, “Justo 1000” o “Menos
de 1000” según el salario de un empleado que se reciba como parámetro esté en un
grupo o en otro.
11
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
END;
Podría llamarse a esta función desde una sentencia SELECT como sigue. Para
cada fila de la tabla Empleados se hace una llamada.
Sintaxis:
Otra sintaxis:
Modificaremos el ejemplo anterior para hacerlo con CASE. Diseñar una función
que devuelva “Más de 1000”, “Justo 1000” o “Menos de 1000” según el salario de un
empleado que se reciba como parámetro esté en un grupo o en otro
12
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
CASE
WHEN SALA=1000 THEN SET CADENA= "JUSTO 1000";
WHEN SALA<1000 THEN SET CADENA= "MENOS DE 1000";
WHEN SALA>1000 THEN SET CADENA= "MÁS DE 1000";
ELSE SET CADENA="ERROR";
END CASE;
RETURN CADENA;
END;
Su sintaxis:
WHILE condición DO
sentencias
END WHILE
Es muy importante que antes del bucle (antes del while) se lleve a cabo la
inicialización de la variable que controla dicho bucle. Además dentro de las sentencias
del bucle, esta variable debe modificarse para que dicho bucle termine y no se
convierta en un bucle sin fin.
13
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
14
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Sintaxis:
REPEAT
sentencias
UNTIL condición
END REPEAT
Su sintaxis:
[Etiqueta_Inicio:] LOOP
Sentencias
END LOOP [Etiqueta_Fin];
Permite realizar un bucle repetitivo que no tiene ninguna condición de salida. Para
salir de un bucle LOOP es necesario incluir una sentencia de salida forzada: LEAVE,
con la sintaxis “LEAVE etiqueta”.
15
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
set m=0;
Eti_Arriba: Loop
set m=m+1;
CASE m
WHEN 1 THEN set nombreMes="Enero";
WHEN 2 THEN set nombreMes="Febrero";
WHEN 3 THEN set nombreMes="Marzo";
WHEN 4 THEN set nombreMes="Abril";
WHEN 5 THEN set nombreMes="Mayo";
WHEN 6 THEN set nombreMes="Junio";
WHEN 7 THEN set nombreMes="Julio";
WHEN 8 THEN set nombreMes="Agosto";
WHEN 9 THEN set nombreMes="Septiembre";
WHEN 10 THEN set nombreMes="Octubre";
WHEN 11 THEN set nombreMes="Noviembre";
WHEN 12 THEN set nombreMes="Diciembre";
ELSE set nombreMes="ERROR";
END CASE;
select nombreMes;
if m=12 then leave Eti_Arriba;
end if;
ITERATE Eti_Arriba;
End Loop Eti_Arriba;
END;
6. Manipuladores de error
16
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Con esta situación, debe declararse un manipulador de error que asocie este
código de error a una sentencia de tratamiento del mismo.
Es necesario, por tanto, conocer los códigos de error que van a ser tratados.
Puedes consultar los códigos de error de MariaDB desde esta web:
https://mariadb.com/kb/en/mariadb/mariadb-error-codes/.
CódigoError debe ser sustituido por el código de error que se quiere tratar.
Finalmente, entre Begin y End, se escriben las sentencias que se ejecutan para
tratar el error que se ha producido. Si es una única sentencia la que trata el error, no
es necesario escribir Begin End.
END;
17
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
7. Manejo de cursores
Un cursor es un objeto que apunta a las filas devueltas por una consulta, es decir,
está asociado a una sentencia SELECT. Esta característica permite manipular los
datos de cada fila de forma individual. Esto puede resultar interesante, ya que en
ocasiones será necesario aplicar un tratamientos distintos a las filas devueltas.
En MariaDB los cursores son de solo lectura y además siempre son leídos desde el
principio hacia el final, es decir, hacia delante.
- Declaración.
- Apertura
- Lectura
- Cierre.
OPEN nombreCursor;
18
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Cada variable debe tener el mismo tipo de datos que la columna que se almacenará
en ella.
Como es lógico, el leer todos los registros devueltos por la SELECT necesita de una
estructura repetitiva (bucle). La sentencia FETCH debe incluirse dentro del bucle para
automatizar el tratamiento.
Para terminar estos bucles debe incluirse un manejador de error especial. Este error
se produce cuando se intenta leer una fila y ya no existen más datos que leer. Su
declaración sería:
Cierre. Una vez leídos los datos debemos cerrar el cursor mediante la sentencia
CLOSE nombreCursor.
19
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
OPEN CUR_NOTAS;
RECORRE: LOOP
/*ACCEDEMOS A LAS FILAS*/
FETCH CUR_NOTAS INTO DNII, NOMBREE, MEDIA;
/*INSERTAMOS LA FILA*/
INSERT INTO DATOS_OPOSITOR (DNI, NOMBRE, MEDIA, COMENTARIO)
VALUES (DNII, NOMBREE, MEDIA, COMENTARIO);
20
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
Las líneas que siguen muestran otra forma de resolver el mismo ejercicio, en este
caso utilizando un bucle WHILE en lugar de LOOP.
OPEN CUR_NOTAS;
/*ACCEDEMOS A LA 1ª FILA*/
FETCH CUR_NOTAS INTO DNII, NOMBREE, MEDIA;
WHILE FIN=0 DO
21
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
END IF;
IF NOTA2<5 THEN
SET COMENTARIO=concat(COMENTARIO, "2-");
END IF;
IF NOTA3<5 THEN
SET COMENTARIO=concat(COMENTARIO, "3");
END IF;
END IF;
/*INSERTAMOS LA FILA*/
INSERT INTO DATOS_OPOSITOR2 (DNI, NOMBRE, MEDIA, COMENTARIO)
VALUES (DNII, NOMBREE, MEDIA, COMENTARIO);
END WHILE;
CLOSE CUR_NOTAS;
END;
Aunque este ejemplo podríamos haberlo hecho sin cursor, nos servirá para su estudio.
22
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
/*ABRIMOS EL CURSOR*/
OPEN LISTAEMPLEADOS;
END IF;
/*ACTUALIZAMOS*/
UPDATE EMPLEADOS SET SALARIO=SALARIO + (SALARIO*INCREMENTO)/100
WHERE NUMEROEMPLEADO=NUMEROE;
/*CERRAMOS EL CURSOR*/
CLOSE LISTAEMPLEADOS;
23
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
8. Disparadores o Triggers.
Puede darse el caso de querer que se lleven a cabo acciones de forma automática,
cada vez que ocurre un determinado suceso. En estas situaciones son de gran utilidad
los disparadores o triggers.
Podemos definir un trigger como una rutina o programa, asociado a una tabla, que
se pone en marcha cuando ocurre un determinado evento sobre la tabla en cuestión.
Estos eventos son las operaciones de inserción, eliminación o actualización (INSERT,
DELETE y UPDATE) sobre esta tabla.
Otros SGBD tienen una gran variedad de eventos que activan un trigger, pero en
MariaDb/MySQL estos solo se activan mediante las operaciones indicadas.
24
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
nombreTrigger_nombreTabla_nombreEvento.
FOR EACH ROW indica que el trigger se lanza por cada fila afectada por el evento. Es
decir, si se lleva a cabo un UPDATE que afecta a tres filas, el disparador se ejecuta
para cada una de ellas.
Para llevar a cabo esta tarea, antes, será necesario crear esa tabla auxiliar donde
guardar estos valores.
25
IES Suárez de Figueroa- @vanza
Administración de sistemas informáticos en red
Gestión de bases de datos Unidad 6. Construcción de guiones
END;
Para ver los disparadores de una base de datos o tabla disponemos de las
órdenes SHOW TRIGGERS y SHOW TRIGGERS FROM BaseDatos WHERE `Table`
= 'nombreTabla'.
- https://mariadb.com/kb/en/stored-procedures/
- https://mariadb.com/kb/en/create-function/
- https://mariadb.com/kb/en/trigger-overview/
- ttps://www.javatpoint.com/mysql-trigger
- https://www.mysqltutorial.org/mysql-triggers.aspx/
- https://manuales.guebs.com/mysql-5.0/triggers.html
26