You are on page 1of 7

GUIA DE PROCEDIMIENTOS Y FUNCIONES ALMACENADOS EN MYSQL

Conceptos, historia y contexto

http://dev.mysql.com/doc/refman/5.0/es/stored-procedures.html
Los procedimientos almacenados y funciones son nuevas funcionalidades de la versin 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.

Algunas situaciones en que los procedimientos almacenados pueden ser particularmente tiles:

Cuando mltiples aplicaciones cliente se escriben en distintos lenguajes o funcionan en distintas plataformas, pero necesitan realizar
la misma operacin 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 operacin se loguea
apropiadamente. En tal entorno, las aplicaciones y los usuarios no obtendran ningn acceso directo a las tablas de la base de datos,
slo pueden ejecutar algunos procedimientos almacenados.

Los procedimientos almacenados pueden mejorar el rendimiento ya que se necesita enviar menos informacin entre el servidor y el cliente. El
intercambio que hay es que aumenta la carga del servidor de la base de datos ya que la mayora del trabajo se realiza en la parte del servidor y no
en el cliente. Considere esto, si muchas mquinas cliente (como servidores Web) se sirven a slo uno o pocos servidores de bases de datos.

Los procedimientos almacenados le permiten tener bibliotecas o funciones en el servidor de base de datos. Esta caracterstica es compartida por
los lenguajes de programacin modernos que permiten este diseo interno, por ejemplo, usando clases. Usando estas caractersticas del lenguaje
de programacin cliente es beneficioso para el programador incluso fuera del entorno de la base de datos.

Los procedimientos almacenados requieren la tabla proc en la base de datos mysql. Esta tabla se crea durante la instalacin de MySQL 5.0. Si
est actualizando a MySQL 5.0 desde una versin anterior, asegrese de actualizar sus tablas de permisos para asegurar que la tabla proc existe.

Definicin general de procedimientos y funciones en mysql

CREATE PROCEDURE sp_name ([parameter[,...]])


[characteristic ...] routine_body

CREATE FUNCTION sp_name ([parameter[,...]])


RETURNS type
[characteristic ...] routine_body

parameter:
[ IN | OUT | INOUT ] param_name type

type:
Any valid MySQL data type

characteristic:
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 vlidos

La lista de parmetros entre parntesis debe estar siempre presente. Si no hay parmetros, se debe usar una lista de parmetros vaca () . Cada
parmetro es un parmetro IN por defecto. Para especificar otro tipo de parmetro, use la palabra clave OUT o INOUT antes del nombre del
parmetro. Especificando IN, OUT, o INOUT slo es vlido para una PROCEDURE.
EJEMPLO DE DEFINICIN (CREACIN, ELIMINACIN Y USO) DE UN PROCEDIMIENTO CON
PARMETROS DE ENTRADA

CREACION DE UN PROCEDIMEINTO EN GENERAL

CREATE PROCEDURE procedure1 /* nombre */


(IN parameter1 INTEGER) /* parametros */
BEGIN /*inicio del la programacin*/
DECLARE variable1 CHAR(10); /* Declarar variables */
IF parameter1 = 17 THEN /* uso del IF */
SET variable1 = 'grande'; /* asignacion */
ELSE
SET variable1 = 'pequeo'; /* asignacion */
END IF; /* fin del IF */
INSERT INTO table1 VALUES (variable1); /* sentencia SQL */
END /* fin del la programacin */

El anterior procedimiento consiste en guardar en una tabla informacin


dependiendo del valor del parmetro.

Adaptaremos el ejemplo: supongamos que en una tabla llamada dimensin que


tiene dos atributos, se pretende que dado un atributo, se inserte informacin en
la tabla generando el segundo atributo.

Para probar el ejemplo en mysql, debemos crear una base de datos y la tabla
de ejemplo dimensin con dos atributos as:

Create database prueba;


Use prueba;
Create table dimension
(
Altura int not null,
tamano varchar(15) not null
);

Creamos el procedimiento as:

DELIMITER $$
CREATE PROCEDURE Decidirdimension
(IN altura INTEGER) /*Este parmetro es de entrada*/
BEGIN
DECLARE variable1 CHAR(15);
IF altura >10 THEN
SET variable1 = 'grande';
ELSE
IF altura >5 THEN
SET variable1 = 'mediano';
ELSE
SET variable1 = 'pequeno';
END IF;
END IF;
INSERT INTO dimension VALUES (altura, variable1);
END
$$
DELIMITER ;

Porque es importante el uso del DELIMITER: por defecto mysql usa como
;
DELIMITER el punto y coma ( ) , es decir, cada vez que encuentre punto y
como(;) ejecuta hasta ah, debido a que los procedimientos y funciones son
varias lneas de cdigos y algunas de ellas terminan con este delimiter se
ejecutara solo hasta ah, lo que ocasionara un error, es por esto que se hace
necesario indicarle a mysql que utilice otro DELIMITER que puede ser
cualquiera para el ejemplo usamos $$ y al finalizar la creacin del
procedimiento o funcin volvemos a cambiarlo por ;

USAR O LLAMAR UN PROCEDIMEINTO

Para llamar un procedimiento se utiliza el comando CALL as:


CALL nombre_de_procedimiento(parametros);

Para el ejemplo seria as:


CALL Decidirdimension(5);
CALL Decidirdimension(8);
CALL Decidirdimension(25);

Verificamos si el procedimiento se hizo adecuadamente:


SELECT * FROM dimension;

Qu est haciendo el procedimiento Decidirdimension?

ELIMINAR UN PROCEDIMEINTO

DROP PROCEDURE decidirdimension;

EJERCICIOS PROPUESTOS DE PROCEDIMEINTOS:


Dada la siguiente tabla persona (peso, estado)
Realice un procedimiento para determinar si la persona
puede donar sangre, si el peso el menor a 50 guarde en
estado no admitido, en caso contrario seria admitido.

Dada la siguiente tabla clientes (cedula, nombre, apellido)


Cree procedimientos para los siguientes casos
1. Que inserte informacin en la tabla clientes. Ayuda(recibe tres parmetros de entrada)
2. Que actualice el nombre de un cliente. Ayuda (recibe dos parmetros, numero de
cedula de quien se va actualizar y el nuevo nombre)
3. Que elimine un cliente. Ayuda (recibe un parmetro, numero de cedula de quien se va
eliminar.
4. Investigar procedimientos con paramentaros de salida.
5. Investigar cmo hacer un ciclo (while).
EJEMPLO DE DEFINICIN (CREACIN, ELIMINACIN Y USO) DE UNA FUNCION

Ejemplo: se necesita calcular el valor de venta de un producto sabiendo que tiene un costo y
porcentaje de ganancia, ejemplo si el costo es 2.000 y el porcentaje de ganancia es 15, el valor
venta seria 2.300
Primera pregunta antes de crear una funcin que paramentaros necesita y que retorna, en
este caso se necesita dos valores uno flotante (el costo y otro entero ( el porcentaje de
ganancia) y retornara un valor flotante.

La funcin quedara as:

DELIMITER $$
CREATE FUNCTION calcularvalorventa(costo float, porganancia int)
RETURNS float DETERMINISTIC
BEGIN
DECLARE vventa FLOAT default 0;
SET vventa = costo +costo*porganancia/100;
RETURN vventa;
END $$

DELIMITER ;

USAR O LLAMAR FUNCION

Para llamar una funcion se hece dentro del select asi:


SELECT nombre_de_funcion(parametros);

Para el ejemplo seria as:


select calcularvalorventa(2000,15) as valorventa;

Esta funcin se puede usar de la siguiente manera con una


tabla.

Cree una tabla llamada productos (cdigo, nombre, costo,


porganancia, cantidad)

Create table productos


(
Codigo int not null primary key,
Nombre varchar(30) not null,
Costo float not null,
Porganancia int not null,
Cantidad float not null
);
Inserte varios datos.
Insert into productos values(1,arroz libra,850,15,10);
Insert into productos values(2,gasesosa 350,800,20,30);
Insert into productos values(3,avena alpina
vaso,1300,10,45);
Insert into productos values(4,menta helada,25,100,150);
Insert into productos values(5,salsa tomate fruco
1000gr,5250,30,8);

select codigo, nombre, costo, calcularvalorventa(costo, Porganancia)


as valorventa from productos;

Se puede crear otra funcin que calcule la ganancia asi:


DELIMITER $$
CREATE FUNCTION calcularganancia(costo float, porganancia int)
RETURNS float DETERMINISTIC
BEGIN
DECLARE ganancia FLOAT default 0;
SET ganancia = costo*porganancia/100;
RETURN ganancia;
END $$

DELIMITER ;

Y lo podra utilizar as:

select codigo, nombre, costo, calcularvalorventa(costo, Porganancia)


as valorventa, calcularganancia(costo, Porganancia) as ganancia from productos;

ELIMINAR UNA FUNCION PROCEDIMEINTO

DROP FUNCTION calcularganancia;

EJERCICIO PROPUESTOS:
Ejercicio 1:
Dada la siguiente tabla

EMPLEADO

CEDULA
NOMBRE
SALARIO BASICO
Cree una funcin para cada punto teniendo en cuenta que:

El subsidio de transporte equivale al 7% al salario bsico


La salud que corresponde al 4% al salario bsico
La pensin que corresponde al 4% al salario bsico
Un bono que corresponde al 8% al salario bsico
El salario integral es la suma del salario bsico -salud - pension +bono + sub de
transporte.

Cree un procedimiento que Inserte informacin a la tabla y pruebe las funciones.

Ejercicio 2:
Dada la siguiente tabla

EMPLEADO

CEDULA
NOMBRE
SALARIO BASICO
SUBSIDIO
SALUD
PENSION
BONO
SALARIO INTEGRAL

Cree una funcin para cada punto teniendo en cuenta que:

El subsidio de transporte equivale al 7% al salario bsico


La salud que corresponde al 4% al salario bsico
La pensin que corresponde al 4% al salario bsico
Un bono que corresponde al 8% al salario bsico
El salario integral es la suma del salario bsico -salud - pension +bono + sub de
transporte.

Cree un procedimiento que Inserte informacin a la tabla y pruebe las funciones.

You might also like