Laboratorio 13
1. Procedimientos almacenados para insercin de registros
Un procedimiento almacenado es similar a una funcin pero no retorna un valor.
Reciben sui nombre porque las instrucciones quedan almacenadas en el servidor. Su
funcin es facilitar la ejecucin de una tarea en la base de datos ya que ahorra
ejecutar toda la sintaxis habitualmente necesaria para ello.
Vamos a crear procedimientos almacenados para insercin de datos. Para ello
utilizaremos la base de datos laboratorio.sql que desarrollamos en el laboratorio 12.
Para esto hemos aprovechado la base de datos creada en MySQL y adems la hemos
creado nuevamente en Oracle.
Los primeros ejercicios sern ejecutados en MySQL y aplican para las tablas
profesor, curso, estudiante y estudiantexcurso.
1.1 Tabla profesor
La tabla profesor tiene esta estructura:
mysql> describe profesor;
+---------------+---------------+-------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| doc_profesor | varchar(20) | NO | PRI | NULL |
|
| nom_profesor | varchar(30) | NO |
| NULL |
|
| ape_profesor | varchar(30) | NO |
| NULL |
|
| cate_prof
| int(11)
| YES |
| NULL |
|
| sal_prof
| int(11)
| YES |
| NULL |
|
+----------------+---------------+-------+-----+---------+-------+
Tiene almacenados los siguientes datos:
mysql> select * from profesor;
+-----------------+------------------+----------------+-----------+----------+
| doc_profesor | nom_profesor | ape_profesor | cate_prof | sal_prof |
+-----------------+------------------+----------------+-----------+----------+
| 1.098.765.789 | Alejandra
| Torres
|
4
| 1100000 |
| 13.826.789
| Maritza
| Angarita
|
1
| 550000 |
| 63.502.720
| Martha
| Rojas
|
2
| 690000 |
| 91.216.904
| Carlos
| Prez
|
3
| 950000 |
+-----------------+-----------------+----------------+------------+----------+
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
La ejecucin del procedimiento desde una IDE es algo distinta, no se puede usar
execute:
Llamamos al procedimiento:
call ins_asegura('2013-08-12', '2014-08-12', 60000000, 'Vigente', 'FDT650',
1200000);
comprobamos que se inserten los datos correctamente.
mysql> select *from aseguramientos;
+-----------+----------------+--------------------+-------------------+-----------+---------+----------+
| 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 |
+-----------+----------------+--------------------+-------------------+----------+------------------+----------+
1.12 Tabla incidentes
+--------------------------+
|
1 | 2012-09-30 | DKZ820 | Bucaramanga |
2|
|
2 | 2012-09-27 | FLL420 | Girn
|
1|
|
3 | 2011-09-28 | FLL420 | Bucaramanga |
2|
|
4 | 2013-09-15 | FDT650 | Barranquilla |
2|
0|
0|
1|
0|
1|
0|
1|
0|
Statement processed.
end loop;
end;
Muestra el resultado:
Placa: FLL420 Expiracin: 09/30/2013 Marca: Chevrolet corsa
Statement processed.
3 Procedimientos almacenados para procesos con MySQL
En MySQL los procedimientos con select no son distintos de los insert y requieren
mucho menos trabajo que con Oracle.
3.1 Proceso mostrar cursos
Vamos a mostrar todos los cursos ordenados por valor.
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 ;
Llamamos el procedimiento y obtenemos los datos que queremos.
Mysql> call mostrar_cursos;
+-----------+-------------------------------------+-----------+-----------+
| cod_curso | nom_curs
| horas_cur | valor_cur |
+-----------+--------------------------------------+-----------+-----------+
|
40 |
500000 |
20 |
500000 |
45 |
550000 |
20 |
700000 |
60 | 3000000 |
| can_art_artped | val_ven_art_artped |
+-----------+--------+----------------------------------------+---------------+--------------------+
| 1|
5|
40000 |
| 1|
12 |
55000 |
| 2|
1 | Redes cisco
5|
65000 |
| 3|
10 |
55000 |
| 3|
12 |
45000 |
| 4|
1 | Redes cisco
20 |
65000 |
+-----------+--------+----------------------------------------+---------------+--------------------+
| comnombre
| comaofun | comreplegal
+----------------+-----------------------+---------------+------------------------+
| 800890890-2 | Seguros Atlantida |
+----------------+------------------------+--------------+--------------------------+
3.4 Clientes ordenados por apellidos:
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:
4. Funciones
4.1 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 funcin y visualizamos el resultado:
mysql> select contar22();
+------------+
| contar22() |
+------------+
|
3
|
+------------+
DELIMITER ;
Probamos la funcin:
Para retornar las distintas editoriales con las cantidades de artculos correspondientes
tuve que usar no una funcin sino un procedimiento con un cursor:
6. Disparadores o Triggers
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 Disparador para profesor en MySQL
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:
Eliminamos el registro:
delete from profesor where doc_profesor = 'Rafael';
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 $$
DROP TRIGGER IF EXISTS laboratoriosql.curso_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`curso_BEFORE_UPDATE` BEFORE UPDATE ON `curso` FOR
EACH ROW
BEGIN
insert into auditoria_curso(audi_nombreAnterior, audi_horasAnterior,
audi_valorAnterior, audi_nombreNuevo, audi_horasNuevo, audi_valorNuevo,
audi_fechaModificacion, audi_usuario, audi_codCurso, audi_accion)
values( old.nom_curs, old.horas_cur, old.valor_cur, new.nom_curs, new.horas_cur,
new.valor_cur, now(), current_user(), new.cod_curso, 'Actualizacin');
END$$
DELIMITER ;
Probamos el disparador:
update curso set nom_curs= 'Procedimientos almacenados MySQL' where cod_curso
= 172943;
6.7.1 Actualizacin
create or replace trigger "ACTUALIZAR_ARTICULO"
BEFORE
update on "ARTICULO"
for each row
begin
insert into auditoria_articulo(TITARTANTERIOR, AUTARTANTERIOR,
EDIARTANTERIOR, PRECARTANTERIOR, TITARTNUEVO, AUTARTNUEVO,
EDIARTNUEVO, PRECARTNUEVO, FECHAMODIFICACION, USUARIO,
IDART, ACCION)
values(:old.tit_art, :old.aut_art, :old.edi_art, :old.prec_art, :new.tit_art,
:new.aut_art, :new.edi_art, :new.prec_art, sysdate, user, :old.id_art, 'Actualizacin');
end;
Al editar un registro de la tabla artculo se crea el registro correspondiente en la tabla
de auditora.
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;
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.