Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MEDIACION VIRTUAL
LABORATORIO 13
SENA
PLATAFORMA VIRTUAL
OCTUBRE 10 DEL 2017
TOMADO DE LAS TABLAS QUE HICE EN EL LABORATORIO 12
TABLA PROFESOR
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.
TABLA CURSO
Calcular el valor promedio de los cursos cuyas horas sean mayores a 40:
Mostrar estudiantes (código y nombre) que iniciaron curso el 01-02-2011, del curso debe
mostrarse el nombre, las horas y el valor:
mysql> select doc_est, nom_est, fec_ini_estcur, nom_curs, horas_cur, valor_cur
-> from estudiante join estudiantexcurso join curso
-> on fec_ini_estcur = '2011-01-02'and doc_est = doc_est_estcur and cod_curso_estcur =
cod_curso;
+-----------------+-----------+-----------------+------------------------+-----------+-----------+
| doc_est | nom_est | fec_ini_estcur | nom_curs | horas_cur | valor_cur |
+-----------------+-----------+------------------+------------------------+--------- --+-----------+
| 1.098.765.678 | Carlos | 2011-01-02 | Manejo de MySQL | 45 | 550000 |
| 1.098.098.097 | Jonatan | 2011-01-02 | Manejo de MySQL | 45 | 550000 |
+-----------------+------------+-----------------+-------------------------+-----------+-----------+
2 rows in set (0.01 sec)
TABLA ESTUDIANTES
TABLA ESTUDIANTEXCURSO
mysql> select cod_curso, doc_est, nom_est, fec_ini_estcur
-> from curso join estudiante join estudiantexcurso
-> on doc_est = doc_est_estcur and cod_curso = cod_curso_estcur;
+------------ +----------------- +-----------+----------------- +
| cod_curso | doc_est | nom_est | fec_ini_estcur |
+------------ +----------------- +-----------+----------------- +
| 289011 | 1.098.765.678 | Carlos | 2011-01-02 |
| 250067 | 63.502.720 | María | 2011-01-03 |
| 289011 | 1.098.098.097 | Jonatan | 2011-01-02 |
| 345671 | 63.502.720 | María | 2011-01-04 |
| 172943 | 72240535 | Jhon | 2014-02-06 |
+------------ +------------------ +----------+------------------ +
TABLA ARTÍCULO:
TABLA TIPOSAUTOMOTORES
tiposautomotores | CREATE TABLE `tiposautomotores` (
`autotipo` int(11) NOT NULL,
`autnombre` varchar(20) DEFAULT NULL,
PRIMARY KEY (`autotipo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
TABLA AUTOMOTORES
Creación tabla Automotores:
hego el llamado:
comprobamos la insercion
+-----------+----------------+--------------------+-------------------+-----------+----------
+----------+
| 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 |
+-----------
+---------------- +-------------------- +------------------- +-----------
+- - - -- - -- - -- - -- - -- -
+---------- +
TABLA INCIDENTES
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:
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 ;
MOSTRAR PEDIDOS
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 ;
Todos los clientes organizados por apellido:
mysql> select * from cliente order by ape_cli;
+------------+----------------+---------+---------------------------------+-----------+-------------+
| id_cli | nom_cli | ape_cli | dir_cli | dep_cli | mes_cum_cli |
+------------+----------------+---------+---------------------------------+-----------+-------------+
| 77191956 | Juan Carlos | Arenas | Diagonal 23 No. 12-34 apto. 101 | Valle | Marzo |
| 13890234 | Roger | Ariza | Carrera 30 No. 13-45 | Antioquia | Junio |
| 63502718 | Maritza | Rojas | Calle 34 No. 14-45 | Santander | Abril |
| 1098765789 | Catalina | Zapata | Avenida el Libertador No. 30-14 | Cauca | Marzo |
+------------+----------------+---------+---------------------------------+-----------+-------------+
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:
INCIDENTES DEL VEHÍCULO FLL420
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
DELIMITER ;
Llamamos el procedimiento:
CONTAR ESTUDIANTES MAYORES DE 22
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 ;
Llamamos la función y visualizamos el resultado:
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$$
Calcular el valor promedio de los cursos cuyas horas sean mayores a 40:
mysql> select avg(valor_cur) from curso where horas_cur > 40;
+------------------+
| avg(valor_cur) |
+------------------+
| 1775000.0000 |
+-------------------+
1 row in set (0.00 sec)
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.
+---------------+-----------------------------------------------+------------------+------------------------+
| id_art_artped | tit_art | can_art_artped | val_ven_art_artped |
+---------------+-----------------------------------------------+------------------+------------------------+
| 3 | Creación de un portal con php y mysql | 5 | 40000 |
| 4 | Administración de sistemas operativos | 12 | 55000 |
| 1 | Redes cisco | 5 | 65000 |
| 2 | Facebook y twitter para adultos | 10 | 55000 |
| 3 | Creación de un portal con php y mysql | 12 | 45000 |
| 1 | Redes cisco | 20 | 65000 |
+---------------+------------------------------------------------+-------------------+-----------------------+
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).
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.
ELIMINANDO REGISTROS
USE `laboratoriosql`;
DELIMITER $$
DELIMITER ;
Elimino el registro:
Y ahora miramos que ha ocurrido con nuestras tablas profesor y auditoría profesor:
ACTUALIZAR CURSO
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 $$
DISPARADOR DE ACTUALIZACIÓN
USE `laboratoriosql`;
DELIMITER $$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
ACTUALIZACIÓN
USE `laboratoriosql`;
DELIMITER $$
ELIMINACIÓN DE REGISTROS
USE `laboratoriosql`;
DELIMITER $$
ACTUALIZACIÓN
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,
ACTUALIZAR
end;