Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Solucioacuten Laboratorio 13 Adsi Sena
Solucioacuten Laboratorio 13 Adsi Sena
Primero creamos un delimitador, este puede ser cualquier smbolo aunque los ms
habituales son // y $$. Dentro se establecen los parmetros y el procedimiento a
ejecutar.
Para mayor comodidad, en esta ocasin no he utilizado la terminal de MySQL sino la
aplicacin grfica MySQL Workbench ya que me permite editar una lnea si cometo
algn 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:
Artculo: Facebook y Twitter para adultos Cantidad: 10 Valor: 55000
Artculo: Creacin de un portal con PHP y MySQL Cantidad: 12 Valor: 45000
Artculo: Creacin de un portal con PHP y MySQL Cantidad: 5 Valor: 40000
Artculo: Administracin de sistemas operativos Cantidad: 12 Valor: 55000
Artculo: Redes Cisco Cantidad: 20 Valor: 65000
Artculo: Redes Cisco Cantidad: 5 Valor: 65000
Statement processed.
Mostrar vehculos cuya pliza vence el 30 de septiembre de 2013 (El ejercicio deca
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 ;
+-----------+--------+----------------------------------------+----------------
+--------------------+
+-----------+--------+----------------------------------------+----------------
+--------------------+
+-----------+--------+----------------------------------------+----------------
+--------------------+
3.3 Empresas fundadas entre 1991 y 1998
USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_empresas`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_empresas()
BEGIN
select *from compaia
where comaofun >= 1991 and comaofun <= 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 funcin que devuelve como valor la edad del alumno ms
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 funcin:
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 funcin ya que hay que devolver varios valores en una variable,
utilice una concatenacin. Para conseguir el valor ms alto realice una subconsulta.
El ejercicio me pide realizarlo con una funcin pero en los ejercicios anteriores
realic inserciones de datos en la tabla artculos y ahora mi tabla tiene este aspecto:
Para retornar las distintas editoriales con las cantidades de artculos correspondientes
tuve que usar no una funcin 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.
Los disparadores son funciones tiles en auditora que se programan para ejecutarse
automticamente cuando se efecta el tipo de accin que los dispara. Esta accin
puede ser Update, insert y delete. Pueden ejecutarse antes (Before) o despus (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 funcin 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 categora y salario del profesor Rafael Conde quien tiene categora 3 y
pasar a 4 con el mismo sueldo que el otro profesor que ostenta esa categora.
Ahora voy a usar ese nuevo usuario para los ejercicios. Cerrando mi conexin y
regresando con mi nuevo usuario y contrasea.
Ahora la funcin 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 $$
Y ahora miramos que ha ocurrido con nuestras tablas profesor y auditora 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 $$
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, 'Actualizacin');
END$$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
6.6.1 Actualizacin
USE `laboratoriosql`;
DELIMITER $$
USE `laboratoriosql`;
DELIMITER $$
6.7.1 Actualizacin
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,
DEPCLINUE, MESNUE,FECHAMOD, USUARIO, IDCLI, ACCION)
values(:old.NOM_CLI, :old.APE_CLI, :old.DIR_CLI, :old.DEP_CLI,
:old.MES_CUM_CLI, :new.NOM_CLI, :new.APE_CLI, :new.DIR_CLI,
:new.DEP_CLI, :new.MES_CUM_CLI, sysdate, user, :old.ID_CLI, 'Actualizacion');
end;
6.8.2 Eliminar registros
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 informacin de las pginas:
www.oracleya.com
www.mysqlconclase.com
www.stackoverflow.com
www.desarrolloweb.com
www.elbauldelprogramador.com
www.techonthenet.com
El resto de la informacin pertenece a los objetos de aprendizaje del Sena.