Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Primero creamos un delimitador, este puede ser cualquier símbolo aunque los más
habituales son // y $$. Dentro se establecen los parámetros y el procedimiento a
ejecutar.
Para mayor comodidad, en esta ocasión no he utilizado la terminal de MySQL sino la
aplicación gráfica MySQL Workbench ya que me permite editar una línea si cometo
algún error y luego ejecutar todo el bloque de instrucciones.
Llamamos al procedimiento:
+-----------+----------------+--------------------+-------------------+-----------+----------
+----------+
| asecodigo | asefechainicio | asefechaexpiracion | asevalorasegurado | aseestado |
aseplaca | asecosto |
+---------------- +-------------------- +-------------------
+-----------
+-----------
+----------
+-------------------
+
| 1 | 2012-09-30 | 2013-09-30 | 30000000 | Vigente | FLL420
| 500000 |
| 2 | 2012-09-27 | 2013-09-27 | 35000000 | Vigente | DKZ820
| 600000 |
| 3 | 2011-09-28 | 2012-09-28 | 50000000 | Vencido | KJQ920
| 800000 |
| 4 | 2013-08-12 | 2014-08-12 | 60000000 | Vigente | FDT650
| 1200000 |
+-----------
+---------------- +-------------------- +------------------- +-----------
+------------------
+---------- +
Muestra el resultado:
Artículo: Facebook y Twitter para adultos Cantidad: 10 Valor: 55000
Artículo: Creación de un portal con PHP y MySQL Cantidad: 12 Valor: 45000
Artículo: Creación de un portal con PHP y MySQL Cantidad: 5 Valor: 40000
Artículo: Administración de sistemas operativos Cantidad: 12 Valor: 55000
Artículo: Redes Cisco Cantidad: 20 Valor: 65000
Artículo: Redes Cisco Cantidad: 5 Valor: 65000
Statement processed.
Mostrar vehículos cuya póliza vence el 30 de septiembre de 2013 (El ejercicio decía
octubre pero no hay datos con esa fecha).
is
cursor curs is
begin
end;
Muestra el resultado:
Statement processed.
En MySQL los procedimientos con select no son distintos de los insert y requieren
mucho menos trabajo que con Oracle.
USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_cursos`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_cursos ()
BEGIN
select *from curso order by valor_cur;
END$$
DELIMITER ;
USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_pedidos`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_pedidos ()
BEGIN
select id_pedido, id_art, tit_art, can_art_artped, val_ven_art_artped
from pedido join articulo join articuloxpedido
on id_pedido = id_ped_artped and id_art_artped = id_art;
END$$
DELIMITER ;
USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_empresas`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_empresas()
BEGIN
select *from compañia
where comañofun >= 1991 and comañofun <= 1998;
END$$
DELIMITER ;
Llamamos el procedimiento:
USE `laboratoriosql`;
DROP procedure IF EXISTS `clientesxapellido`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE clientesxapellido ()
BEGIN
select *from cliente
order by ape_cli desc;
END$$
DELIMITER ;
Llamamos el procedure:
USE `laboratoriosql`;
DROP procedure IF EXISTS `incidentes1herido`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE incidentes1herido ()
BEGIN
select incifecha, inciplaca, asefechainicio, aseestado, asevalorasegurado
from incidentes join aseguramientos
on inciplaca = aseplaca and incicantheridos = 1;
END$$
DELIMITER ;
Llamamos el proceso:
USE `laboratoriosql`;
DROP procedure IF EXISTS `incifll420`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE incifll420 ()
BEGIN
select incifecha, inciplaca, asefechainicio, asefechaexpiracion, aseestado,
asevalorasegurado
from incidentes join aseguramientos
on inciplaca = aseplaca and inciplaca = 'FLL420';
END$$
DELIMITER ;
Llamamos el procedimiento:
4. Funciones
USE `laboratoriosql`;
DROP function IF EXISTS `contar22`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION contar22 ()
RETURNS INTEGER
BEGIN
DECLARE cantidad int;
select count(*) into cantidad from estudiante
where edad_est > 22;
RETURN cantidad;
END$$
DELIMITER ;
Primero he creado una función que devuelve como valor la edad del alumno más
joven:
USE `laboratoriosql`;
DROP function IF EXISTS `masJoven`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION masJoven ()
RETURNS int
BEGIN
DECLARE masJoven int;
SELECT edad_est into masJoven
from estudiante
order by edad_est asc limit 1;
RETURN masJoven;
END;$$
DELIMITER ;
USE `laboratoriosql`;
DROP function IF EXISTS `promediocursos`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION promediocursos ()
RETURNS INTEGER
BEGIN
declare var_promedio int;
select avg(valor_cur) into var_promedio
from curso
where horas_cur > 40;
RETURN var_promedio;
END$$
DELIMITER ;
Probamos la función:
USE `laboratoriosql`;
DROP function IF EXISTS `promediosueldo`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION promediosueldo ()
RETURNS INTEGER
BEGIN
DECLARE avgsueldo int;
SELECT AVG(sal_prof) INTO avgsueldo FROM profesor
WHERE cate_prof = 1;
RETURN avgsueldo;
END$$
DELIMITER ;
USE `laboratoriosql`;
DROP function IF EXISTS `menorSueldo`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION menorSueldo ()
RETURNS VARCHAR(30)
BEGIN
DECLARE nombre VARCHAR(30);
SELECT nom_profesor INTO nombre
FROM profesor
ORDER BY sal_prof ASC LIMIT 1;
RETURN nombre;
END$$
DELIMITER ;
Para resolver esta función ya que hay que devolver varios valores en una variable,
utilice una concatenación. Para conseguir el valor más alto realice una subconsulta.
El ejercicio me pide realizarlo con una función pero en los ejercicios anteriores realicé
inserciones de datos en la tabla artículos y ahora mi tabla tiene este aspecto:
Para retornar las distintas editoriales con las cantidades de artículos correspondientes
tuve que usar no una función sino un procedimiento con un cursor:
create or replace procedure "PA_EDITORIALES"
is
cursor curs is
select edi_art ||' '||count(*) edi_art
from articulo group by edi_art;
begin
for valores in curs loop
dbms_output.put_line (valores.edi_art);
end loop;
end;
begin
pa_editoriales;
end;
Alphaomega-Rama 4
Alphaomega-rama 1
Oveja negra 1
Statement processed.
Esta función es similar a la que solicitaba el valor del pedido más costoso:
Los disparadores son funciones útiles en auditoría que se programan para ejecutarse
automáticamente cuando se efectúa el tipo de acción que los dispara. Esta acción
puede ser Update, insert y delete. Pueden ejecutarse antes (Before) o después (After).
6.1.1 Actualizar
Creamos una tabla para auditoria llamada “auditoria_profesor” la cual incluirá los
viejos y nuevos valores de las columnas afectadas, y el usuario del sistema que
realizó los cambios. Para esto último se utiliza la función current_user() que ya viene
definida en MySQL, la cual se colocará como valor por defecto para la columna
audi_usuario:
USE `laboratoriosql`;
DELIMITER $$
Voy a editar la categoría y salario del profesor Rafael Conde quien tiene categoría 3 y
pasará a 4 con el mismo sueldo que el otro profesor que ostenta esa categoría.
Ahora voy a usar ese nuevo usuario para los ejercicios. Cerrando mi conexión y
regresando con mi nuevo usuario y contraseña.
Ahora la función current_user() devuelve el valor jhonbarc@localhost.
Vamos a borrar un registro en la tabla profesor con el nuevo usuario. Pero primero
vamos a crear un trigger para ese evento:
USE `laboratoriosql`;
DELIMITER $$
DELIMITER ;
Eliminamos el registro:
Y ahora miramos que ha ocurrido con nuestras tablas profesor y auditoría profesor:
Se ha borrado el registro del profesor Rafael Conde y ahora sí aparece que el evento
lo realizó el usuario jhonBarc tal como se ve en la siguiente imagen:
USE `laboratoriosql`;
DELIMITER $$
Probamos el disparador:
USE `laboratoriosql`;
DELIMITER $$
DELIMITER $$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.estudiante_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`estudiante_BEFORE_UPDATE` BEFORE UPDATE ON
`estudiante` FOR EACH ROW
BEGIN
insert into auditoria_estudiantes(audi_nomAnterior, audi_apeAnterior,
audi_edadAnterior, audi_nomNuevo, audi_apeNuevo, audi_edadNuevo,
audi_fechaModificacion, audi_usuario, audi_docest, audi_accion)
values(old.nom_est, old.ape_est, old.edad_est, new.nom_est, new.ape_est,
new.edad_est, now(), current_user(), old.doc_est, 'Actualización');
END$$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
6.6.1 Actualización
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
6.7.1 Actualización
6.8.1 Actualizar
create or replace trigger "ACTUALIZAR_CLIENTE"
BEFORE
update on "CLIENTE"
for each row
begin
insert into auditoria_cliente(NOMCLIANT, APECLIANT, DIRCLIANT, DEPCLIANT, MESANT, NOMCLINUE, APECLINUE, DIRCLINUE,
6.9.1 Actualizar
end;
Referencias
Las bases de datos fueron creadas con las herramientas MySQL Workbench y la
interfaz web de Oracle.
Se utilizó información de las páginas:
www.oracleya.com
www.mysqlconclase.com
www.stackoverflow.com
www.desarrolloweb.com
www.elbauldelprogramador.com
www.techonthenet.com
El resto de la información pertenece a los objetos de aprendizaje del Sena.