You are on page 1of 8

Procedimientos Almacenados

Creacin de la base de datos:


Base de datos de ejemplo Creacin:

DROP DATABASE IF EXISTS videoteca;


CREATE DATABASE videoteca;
Tablas:
USE videoteca;

CREATE TABLE actor (


id INTEGER UNSIGNED NOT NULL
AUTO_INCREMENT,
nombre VARCHAR(64) NOT NULL,
apellidos VARCHAR(64) NOT NULL,
PRIMARY KEY(id)
)
ENGINE = InnoDB;

CREATE TABLE actor_ext (


idactor INTEGER UNSIGNED NOT NULL,
imdb VARCHAR(32) NOT NULL,
carpeta VARCHAR(255) NOT NULL,
PRIMARY KEY(idactor),
INDEX ae_FK(idactor),
FOREIGN KEY(idactor)
REFERENCES actor(id)
)
ENGINE = InnoDB;
Inserciones:
USE videoteca;

INSERT INTO actor(nombre, apellidos)


VALUES('Harrison', 'Ford');

INSERT INTO actor(nombre, apellidos)


VALUES('Russell', 'Crowe');

INSERT INTO actor_ext(idactor, imdb, carpeta)


VALUES(1, 'nm0000148', 'harrison_ford');

INSERT INTO actor_ext(idactor, imdb, carpeta)


VALUES(2, 'nm0000128', 'russell_crowe');
Lista de actores
En su versin ms simple:
CREATE or replace PROCEDURE pa_actores_lista()
SELECT * FROM actor;

Para ejecutar el procedimiento almacenado:


USE videoteca;

CALL pa_actores_lista();

Nmero de registros en la tabla de actores

CREATE PROCEDURE pa_actores_cantidad()


SELECT
COUNT(*)
FROM
actor;

Delimitadores
Nmero de actores, usando variables y delimitadores:

DELIMITER //
CREATE PROCEDURE pa_actores_cantidad2()
BEGIN
DECLARE actores INT;
SELECT
COUNT(*)
FROM
actor
INTO
actores;
SELECT actores;
END

//
DELIMITER ;

Parmetros
Lista de actores cuyo nombre comienza con una determinada letra:
USE videoteca;
CREATE PROCEDURE pa_actores_buscar(letra CHAR(2))
SELECT
*
FROM
actor
WHERE
nombre LIKE letra;
Actores cuyo nombre comienza con la letra h:
USE videoteca;

CALL pa_actores_buscar('h%');
Ahora, tambin se necesita el nmero de actores localizados:
USE videoteca;
DELIMITER //
CREATE PROCEDURE pa_actores_buscar2(
IN letra CHAR(2),
OUT actores INT
)
BEGIN
SELECT * FROM actor
WHERE nombre LIKE letra;

SELECT COUNT(*) INTO


actores
FROM actor
WHERE nombre LIKE letra;
END
//
DELIMITER ;

Llamada a este procedimiento:


USE videoteca;

CALL pa_actores_buscar2('h%', @cantidad);


Obtener el nmero de actores:
SELECT @cantidad;
Como variables almacenadas:
select @cantidad:=count(id) from actor;

Funciones almacenadas
Nmero de actores:
USE videoteca;
DELIMITER //
CREATE FUNCTION fa_actores_cantidad()
RETURNS INT
BEGIN
DECLARE actores INT;
SELECT
COUNT(*)
INTO
actores
FROM
actor;
RETURN actores;
END
//
DELIMITER ;

Llamada a la funcin almacenada:


USE videoteca;
SELECT fa_actores_cantidad();
Eliminacin
Eliminar un procedimiento almacenado y crearlo de nuevo:
USE videoteca;
DROP PROCEDURE IF EXISTS pa_actores_lista;
CREATE PROCEDURE pa_actores_lista()
SELECT
*
FROM
actor
ORDER BY
apellidos,
nombre;

Detalles
Obtencin del cdigo de un procedimiento almacenado existente:
USE videoteca;
SHOW CREATE PROCEDURE pa_actores_lista;

Respuesta ms ordenada:
USE videoteca;
SHOW CREATE PROCEDURE pa_actores_lista\G

Detalles de un procedimiento almacenado:


USE videoteca;
SHOW PROCEDURE STATUS LIKE 'pa_actores_lista'\G

Detalles de todos los procedimientos almacenados:


USE videoteca;
SHOW PROCEDURE STATUS\G

Procedimientos almacenados activos


Insercin de un nuevo actor:
USE videoteca;
CREATE PROCEDURE pa_actor_insertar(
nuevo_nombre VARCHAR(64),
nuevo_apellidos VARCHAR(64),
nuevo_imdb VARCHAR(32)
)

INSERT INTO actor(


nombre,
apellidos,
imdb
)
VALUES(
nuevo_nombre,
nuevo_apellidos,
nuevo_imdb
);

Una insercin:
USE videoteca;
CALL pa_actor_insertar(
'Tim','Robbins','nm0000209');

Lista de actores:
USE videoteca;

CALL pa_actores_lista();

Vistas
USE videoteca;
SELECT
a.id,
a.nombre,
a.apellidos,
ae.imdb
FROM
actor a
JOIN actor_ext ae ON a.id = ae.idactor;
Vista con el mismo objetivo:
USE videoteca;

CREATE VIEW v_actor AS


SELECT a.id, a.nombre, a.apellidos, ae.imdb
FROM
actor a
JOIN actor_ext ae ON a.id = ae.idactor;

Uso de la vista:
USE videoteca;
SELECT * FROM v_actor;

Modificacin
Llamada a una vista incluyendo ordenacin:
USE videoteca;
SELECT
*
FROM
v_actor
ORDER BY
apellidos, nombre;

Modificacin del comportamiento de la vista:


USE videoteca;
CREATE OR REPLACE VIEW v_actor AS
SELECT
a.id,
a.nombre,
a.apellidos,
ae.imdb
FROM
actor a
JOIN actor_ext ae ON a.id = ae.idactor
ORDER BY
apellidos, nombre;
O:
USE videoteca;
ALTER VIEW v_actor AS
SELECT
a.id,
a.nombre,
a.apellidos,
ae.imdb
FROM
actor a
JOIN actor_ext ae ON a.id = ae.idactor
ORDER BY
apellidos, nombre;

Detalles
USE videoteca;
SHOW CREATE VIEW v_actor;
De otra forma:
USE videoteca;

SHOW CREATE VIEW v_actor\G


Eliminacin
USE videoteca;

DROP VIEW v_actor;


Disparadores
Desencadenador de insercin
USE videoteca;

DELIMITER //
CREATE TRIGGER dc_actor_insertar
AFTER INSERT ON actor
FOR EACH ROW BEGIN

DECLARE nuevo_carpeta VARCHAR(255);

SET nuevo_carpeta = CONCAT(


LOWER(NEW.nombre),
'_',
LOWER(NEW.apellidos)
);

INSERT INTO actor_ext(idactor, imdb, carpeta)


VALUES(NEW.id, '', nuevo_carpeta);

END
//
DELIMITER ;
Insercin de un nuevo actor:
USE videoteca;
INSERT INTO actor(nombre, apellidos)
VALUES('Tim','Robins');
Desencadenador de actualizacin
USE videoteca;

DELIMITER //
CREATE TRIGGER dc_actor_actualizar
AFTER UPDATE ON actor
FOR EACH ROW BEGIN

DECLARE nuevo_carpeta VARCHAR(255);

SET nuevo_carpeta = CONCAT(


LOWER(NEW.nombre),
'_',
LOWER(NEW.apellidos)
);

UPDATE
actor_ext
SET
carpeta = nuevo_carpeta
WHERE
idactor = NEW.id;
END
//
DELIMITER ;
Cambiar el nombre del actor:
USE videoteca;

UPDATE
actor
SET
apellidos = 'Robbins'
WHERE
id = 3;
Borrado
USE videoteca;

DELIMITER //
CREATE TRIGGER dc_actor_eliminar
BEFORE DELETE ON actor
FOR EACH ROW BEGIN

DELETE FROM
actor_ext
WHERE
idactor = OLD.id;

END
//
DELIMITER ;
Borrar un actor:
USE videoteca;
DELETE FROM actor WHERE id = 3;

You might also like