Tema: Creación Mysql
de
Procedimientos
en
Facultad : Ingeniería Escuela : Computación Asignatura: Base de Datos II
GUÍA 5 Pág.
1
I. OBJETIVOS Trabajar con el modo consola de Mysql Describir cómo se procesa un procedimiento almacenado. II. INTRODUCCIÓN
Procedimientos almacenados
Los procedimientos almacenados es una nueva funcionalidad de la versión de MySQL 5.0. Un procedimiento almacenado es un conjunto de comandos SQL que pueden almacenarse en el servidor. Una vez que se hace, los clientes no necesitan relanzar los comandos individuales pero pueden en su lugar referirse al procedimiento almacenado. Los procedimientos almacenados se crean con comandos CREATE PROCEDURE. Un procedimiento se invoca usando un comando CALL, y sólo puede pasar valores usando variables de salida. Una función puede llamarse desde dentro de un comando como cualquier otra función (esto es, invocando el nombre de la función), y puede retornar un valor escalar. Algunas situaciones en que los procedimientos almacenados pueden ser particularmente útiles: Cuando múltiples aplicaciones cliente se escriben en distintos lenguajes o funcionan en distintas plataformas, pero necesitan realizar la misma operación en la base de datos. Cuando la seguridad es muy importante. Los bancos, por ejemplo, usan procedimientos almacenados para todas las operaciones comunes. Esto proporciona un entorno seguro y consistente, y los procedimientos pueden asegurar que cada operación se loguea apropiadamente. En tal entorno, las aplicaciones y los usuarios no obtendrían ningún acceso directo a las tablas de la base de datos, sólo pueden ejecutar algunos procedimientos almacenados. Sintaxis de procedimiento almacenado CREATE PROCEDURE sp_name ([parameter [,...]]) [characteristic ...] routine_body ARGUMENTOS
parameter :
[ IN | OUT | INOUT ] param_name type type : Any valid MySQL data type characteristic : GUÍA 5 Pág.
2
LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string ' routine_body : procedimientos almacenados o comandos SQL válidos
Para borrar un procedimiento se utiliza la sentencia DROP: DROP PROCEDURE nombre_procedimiento III. MATERIAL Y EQUIPO A UTILIZAR Guía de Laboratorio Nº 5 Computadora con WAMP SERVER Disquete o memoria USB IV. PROCEDIMIENTO Ejercicio 1 -En su maquina detenga el ISS y active el WampServer. -Cree una base de datos con el nombre ventas y cree las siguientes tablas dentro de ella. CREATE TABLE `vendedor` ( `idvendedor` int(11) NOT NULL, `nombre` varchar(30) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- Estructura de tabla para la tabla `venta` CREATE TABLE `venta` ( `idventa` int(11) NOT NULL auto_increment, `ventas` double NOT NULL, `comision` double NOT NULL, `idvendedor` int(11) NOT NULL, PRIMARY KEY (`idventa`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
GUÍA 5 Pág.
3
-En la barra de tareas cerca del reloj busque el icono que parece medidor sobre el de clic sobre MySql y de clic en MySql consola
de clic
- Se abrirá la siguiente ventana que pedirá una contraseña presione la tecla enter - Ahora necesitamos establecer la base de datos en la que trabajáremos, para este caso haremos uso del comando USE
No olvide escribir el punto y coma después de cada sentencia, para que la consola de Mysql reconozca que termina la línea, si no escribe punto y coma, Mysql pensara que ud agregara más parámetros a la sentencia que esta creando. -Ahora ejecute el siguiente comando SELECT * from vendedor; Mysql le dirá que la tabla esta vacía, los comandos que necesita la consola de Mysql son exactamente los mismos que utilizamos con PhpmyAdmin, pero recuerde que el punto y coma no debe faltar. -Ejercicio 2 En este ejercicio crearemos un procedimiento almacenado, para realizar una inserción en la tabla vendedores. Linea 1 2 3 4 5 6 7
Sentencias USE ventas Delimiter $$ CREATE PROCEDURE ins_vendedor(IN id INT, IN nom VARCHAR(30) BEGIN INSERT INTO vendedor VALUES(id,nom); END $$ GUÍA 5 Pág.
4
Descripcion de sentencias Línea 1: Seleccionamos la base de datos en la que se trabajaremos. Línea 2: el delimitador por defecto en mysql es ; dentro del procedimiento almacenado necesitaremos utilizar el punto y coma, si el delimitador no se cambia, al momento de colocar ; dentro del procedimiento, Mysql dará por terminada la sentencia, es por ello que lo cambiaremos, es recomendable utilizar 2 símbolos para un delimitador ya sea ##,$$,// etc. Línea 3. Creamos el procedimiento con nombre ins_vendedor y se recibirán 2 parámetros de entrada (IN) que será id y nom, parecidos como en una función de programación Línea 4. Damos inicio a las sentencias de Mysql que estarán dentro del procedimiento Línea 5. En este procedimiento solo se hará una inserción de datos en la tabla vendedor Línea 6. Finalizamos el procedimiento Línea 7. Utilizamos el delimitador que definimos anteriormente para indicar que ya terminamos el procedimiento Ahora cambia nuevamente el delimitador para que funcione el procedimiento con el comando DELIMITER ; Haremos una inserción de datos utilizando el procedimiento de la siguiente manera Call ins_vendedor (101,’Juan Perez’); -Inserte 5 registros mas a la tabla utilizando el procedimiento creado Ejercicio 2: Crear un procedimiento que calcule la comisión que recibirá un vendedor si la comisión se calcula de la siguiente manera Si ventas es mayor o igual que 200, tiene una comisión de 20% de las ventas Si ventas es menor que 200, tiene una comisión de 5% de las ventas, los valores a pedir en el ejercicio serán, id del vendedor y valor de ventas línea 1 2 3 4 5 6 7 8 9 10 11
Sentencia Delimiter $$ Create procedure calc_comision(IN id int, IN venta double) Begin Declare comision double; If venta >=200 then SET comision=venta*0.2; Else SET comision=venta*0.05; END IF; Insert into venta VALUES(0,venta,comision,id); Select ‘Se inserto un nuevo registro en la tabla comisión’ AS Mensaje;
GUÍA 5 Pág.
5
12 13 14
END $$ Delimiter ;
Línea 1: cambiamos delimitador Línea 2: creamos el procedimiento que recibirá 1 id entero y una variable llamada venta de tipo doble Línea 3: comienza el procedimiento Línea 4: declaramos una variable de tipo double. Linea 5: Abrimos un IF al estilo Basic(IF THEN ELSE, ELSEIF,END IF) Línea 6: se asigna a la variable comisión venta*0.2, para poder realizar una asignación u operación se utiliza SET Línea 9: cerramos el if con un end if y punto y coma al final Línea 10: realizamos la inserción Línea 11: enviamos un mensaje Línea 12: terminamos el procedimiento. Ejercicio 3 En el ejercicio 1 se creo un procedimiento, que permitia insertar vendedores, pero no distinguia si el vendedor ya existia o no, en este ejercicio haremos un validación con el idvendedor, si este ya existe el procedimiento debe enviar un mensaje de alerta. create procedure insv(IN id int, IN n varchar(30)) begin select count(*) into @num from vendedor where idvendedor=id; if @num>0 then select CONCAT('YA EXISTE EL CODIGO DEL VENDEDOR ',id) as ALERTA; else insert into vendedor values(id,n); select 'Registro insertado con exito' AS MENSAJE; end if; end
En este procedimiento en la línea en negrita se hizo uso de Select into, la cual nos permito guardar un valor dentro de una variable, que posteriormente podemos utilizar
GUÍA 5 Pág.
6
Ejercicio 4 El siguiente procedimiento posee 2 parámetros el primero IN y el segundo OUT. create procedure nombre(IN id int, OUT n varchar(30)) begin select nombre into n from vendedor where idvendedor=id; end Al llamar el procedimiento se hará de la siguiente manera CALL nombre_pro(id,@variable), donde @variable obtendrá el valor que se le asignó a la variable n dentro del procedimiento por ser OUT. Ejemplo: CALL nombre(101,@x); Ahora si queremos ver el valor que obtuvo @x, lo hacemos de la siguiente manera: SELECT @x AS VENDEDOR; Ejercicio 5 Modifique el procedimiento en el ejercicio 3, de tal manera que no permita que al insertar el idvendedor y el nombre del vendedor existan en la tabla. Ejercicio 6 Crear un procedimiento que pida, el id del vendedor, el nombre del vendedor y el valor de la venta, y calcule la comision de la siguiente manera Si la ventas es = 100 tiene una comision del 10% Si la venta es mayor que 100 tiene una comision del 20% Si la venta es menor que 100 tiene una comision del 5%. El procedimiento debe guardar los datos en la tabla vendedor siempre validando los datos y en la tabla comisiones, respetando a que vendedor pertenece la venta realizada.
GUÍA 5 Pág.
7
V. INVESTIGACIÓN Y EJERCICIOS COMPLEMENTARIOS Investigue que son los Triggers en Mysql y realice 2 ejemplos utilizando la base de datos que se uso en esta practica
GUÍA 5 Pág.
8