Sie sind auf Seite 1von 8

RESUMEN MANUAL DE REFERENCIA MYSQL 5.

PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

PROCEDIMIENTOS ALMACENADOS

Los procedimientos almacenados son nuevas funcionalidades 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 mandar los comandos individuales sino que en su lugar se refieren al procedimiento
almacenado, lo que mejora el rendimiento.

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 se necesita una rutina que devuelva mas de un valor (para el caso contrario –un valor- se
utilizan funciones).

 Cuando la seguridad es muy importante. Se crean procedimientos para realizar operaciones comunes.
Esto proporciona un entorno seguro y consistente, y los procedimientos pueden asegurar que cada
operación se loguea apropiadamente. En este 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.

Los procedimientos almacenados pueden mejorar el rendimiento ya que se necesita enviar menos información
entre el servidor y el cliente. Esto trae como consecuencia el aumento de carga del servidor de la base de datos
ya que la mayoría del trabajo se realiza en la parte del servidor y no en el cliente.

Los procedimientos almacenados le permiten tener bibliotecas o funciones en el servidor de base de datos.

MySQL sigue la sintaxis SQL:2003 para procedimientos almacenados, que también usa IBM DB2.

1. PROCEDIMIENTOS ALMACENADOS Y LAS TABLAS DE PERMISOS


Los procedimientos almacenados requieren la tabla PROC en la base de datos MYSQL. Esta tabla se crea
durante la instalación de MySQL 5.0.

Verifique que la tabla PROC existe:

Mysql>use mysql;
Mysql>show tables;

Tambien desde el phpMyAdmin se puede ver esta información. Adicionalmente para ver los procedimientos
creados se hace un select * from procs;

Desde MySQL 5.0.3, el sistema de permisos se ha modificado para tener en cuenta los procedimientos
almacenados:

 El permiso CREATE ROUTINE se necesita para crear procedimientos almacenados.

 El permiso ALTER ROUTINE se necesita para alterar o borrar procedimientos almacenados. Este permiso
se da automáticamente al creador de una rutina.

 El permiso EXECUTE se requiere para ejecutar procedimientos almacenados. Sin embargo, este permiso se
da automáticamente al creador de la rutina.
RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

2. SINTAXIS DE PROCEDIMIENTOS ALMACENADOS

Los procedimientos almacenados se crean con comandos CREATE PROCEDURE. Un procedimiento se invoca
usando el comando CALL, y sólo puede pasar valores usando variables de salida (OUT). Las rutinas
almacenadas pueden llamar otras rutinas almacenadas.

Desde MySQL 5.0.1, los procedimientos almacenados se asocian con una base de datos. Esto tiene varias
implicaciones:

 Cuando se invoca la rutina, se realiza implícitamente USE db_name (y se deshace cuando acaba la rutina).
Los comandos USE dentro de procedimientos almacenados no se permiten.

 Puede calificar los nombres de rutina con el nombre de la base de datos. Esto puede usarse para referirse a
una rutina que no esté en la base de datos actual. Por ejemplo, para invocar procedimientos almacenados P
esto se asocia con la base de datos test , puede decir CALL test.p().

 Cuando se borra una base de datos, todos los procedimientos almacenados asociados con ella también se
borran.

(En MySQL 5.0.0, los procedimientos almacenados son globales y no asociados con una base de datos. Heredan
la base de datos por defecto del llamador. Si se ejecuta USE db_name desde la rutina, la base de datos por
defecto original se restaura a la salida de la rutina.)

CREATE PROCEDURE nombre_procedimiento ( parametros)


BEGIN
Instrucciones
END

3. USO DE PARAMETROS

Los subprogramas traspasan información utilizando parámetros. Las variables o expresiones referenciadas en la
lista de parámetros de una llamada a un subprograma son llamados parámetros actuales. Las variables
declaradas en la especificación de un subprograma y utilizadas en el cuerpo son llamados parámetros formales.
En este último caso (para los parámetros formales) se pueden explicitar tres modos diferentes para definir la
conducta de los parámetros: IN, OUT e IN OUT.

Parámetros de modo IN
Estos parámetros son la entrada a las funciones y procedimientos y actúan dentro de ellas como constantes, es
decir, sus valores no pueden ser alterados dentro de un subprograma.

Parámetros de modo OUT


Un parámetro de salida (OUT) permite comunicar valores al bloque de programa que invocó al subprograma que
utiliza este parámetro. Esto quiere decir además, que es posible utilizar un parámetro de este tipo como si fuera
una variable local al subprograma.
En el programa que invoca el procedimiento, el parámetro de modo OUT debe ser una variable, nunca una
expresión o una constante.

Parámetros de modo IN OUT


Esta modalidad permite proporcionar valores iniciales a la rutina del subprograma y luego devolverlos
actualizados. Al igual que el tipo anterior, un parámetro de este tipo debe corresponder siempre a una variable.
RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

Si la salida de un subprograma es exitosa, entonces MYSQL asignará los valores que corresponda a los
parámetros actuales (los que reciben los valores de los parámetros formales en la rutina que llama al
subprograma). Por el contrario, si la salida del subprograma se produce con un error no manejado en alguna
excepción, no se asignará ningún valor a los parámetros actuales.

RESUMEN

IN OUT IN OUT
es el tipo por defecto debe ser especificado debe ser especificado
pasa valores a un subprograma retorna valores a quien lo llamó pasa valores iniciales al
subprograma y retorna un valor
actualizado a quien lo llamó
un parámetro formal actúa como parámetros formales actúan como parámetros formales actúan como
una constante variables una variable inicializada
a un parámetro formal no se le a un parámetro formal debe a un parámetro formal podría
puede asignar un valor asignársele un valor asignársele un valor
los parámetros actuales pueden los parámetros actuales deben ser los parámetros actuales deben ser
ser constantes, variables variables variables
inicializadas, literales o
expresiones

NOTA:
La lista de parámetros entre paréntesis debe estar siempre presente. Si no hay parámetros, se
debe usar una lista de parámetros vacía ( ) . Cada parámetro es un parámetro IN por defecto.
Para especificar otro tipo de parámetro, use la palabra clave OUT o INOUT antes del nombre del
parámetro. Especificando IN, OUT, o INOUT sólo es valido para una PROCEDURE.
RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

4. EJEMPLO

EL siguiente procedimiento cuenta los registros de la tabla EMPLEADO que corresponde a la base de datos
EMPRESA.

A continuación se describen las actividades para crear, llamar, ver resultados del procedimiento PRUEBA:

Seleccionamos la base de datos donde vamos a crear el


Seleccionar base de
PRIMERO

Mysql>use empresa; procedimiento.


datos

Database changed Si se omite este paso, entonces al hacer referencia a una tabla en
el procedimiento debe anteponerse el nombre de la base de datos.
Por ejemplo: empresa. empleado.
Se usa el comando delimiter para cambiar el delimitador por
Mysql> delimiter // defecto de MYSQL ; (punto y coma). Puede usar cualquier carácter
Mysql> create procedure prueba(out cuenta int) como delimitador a excepción de ('\') ya que es el carácter de
->begin escape de MySQL.
->select count(*) into cuenta from empleado;
Se crea un procedimiento llamado PRUEBA el cual tiene un
Crear el procedimiento

->end
->// parámetro CUENTA de tipo entero.
SEGUNDO

Query OK, 0 rows affected(0.00 sec)


La sentencia select cuenta los registros que hay en la tabla
empleado. Esta sintaxis SELECT almacena columnas seleccionadas
directamente en variables. Por lo tanto, sólo un registro puede
retornarse.

END determina el fin del cuerpo del procedimiento y los caracteres


// el final del procedimiento.
Mysql> delimiter ; Cambia el delimitador (fin de un comando) nuevamente a ;
Llamar el procedimiento

Mysql> call prueba(@a); Llamamos el procedimiento con CALL y enseguida el nombre. En


TERCERO

el paréntesis se indica el nombre de la variable que va a guardar el


Query OK, 0 rows affected(0.48 sec)
resultado.
El comando CALL invoca un procedimiento definido previamente
con CREATE PROCEDURE.
RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19
Ver contenido de la variable

Mysql>select @a; Verificamos que la variable contiene el resultado del


+----------------+ procedimiento.
CUARTO

| @a |
+----------------+
| 3 |
+----------------+
1 row in set (0.00 sec)

OTROS COMANDOS PARA LOS PROCEDIMIENTOS


Este comando es una extensión de MySQL . Similar a SHOW
VER SINTAXIS DEL
PROCEDIMIENTO

mysql> show create procedure prueba; CREATE TABLE, retorna la cadena exacta que puede usarse para
recrear la rutina nombrada.

Este comando es una extensión de MySQL . Retorna características


PROCEDIMIENTO
ADICIONAL DEL
INFORMACION

mysql> show procedure status like ‘prueba’; de rutinas, como el nombre de la base de datos, nombre, tipo,
creador y fechas de creación y modificación. Si no se especifica un
patrón( nombre del procedimiento), le lista la información para
todos los procedimientos almacenados.
Este comando se usa para borrar un procedimiento o función
mysql> drop procedure prueba; almacenado. Esto es, la rutina especificada se borra del servidor.
BORRAR EL PROCEDIMIENTO

Debe tener el permiso ALTER ROUTINE para las rutinas desde


MySQL 5.0.3. Este permiso se otorga automáticamente al creador
o
de la rutina.
La cláusula IF EXISTS es una extensión de MySQL . Evita que ocurra
mysql> drop procedure if exists prueba;
un error si la función o procedimiento no existe. Se genera una
advertencia que puede verse con SHOW WARNINGS.
RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

5. OTROS EJEMPLOS.

Los siguientes ejemplos muestran de manera muy sencilla como se crea y llama un procedimiento. No utilizan
variables dentro del programa.

EJEMPLO 1
EL PROCEDIMIENTO CUENTA_EMP CUENTA LOS REGISTROS QUE TIENE LA TABLA EMPLEADOS Y ALMACENA EL
RESULTADO EN LA VARIABLE VAR1.

RECUERDE QUE ANTES DE CREAR EL PROCEDIMIENTO HAY QUE UBICARSE EN LA BASE DE DATOS CORRESPONDIENTE. EN
ESTE CASO EMPRESA. INO DEBE REFERIRSE A LA TABLA EMPLEADO ASI: EMPRESA.EMPLEADO.

USE EMPRESA;

--------------------------CREAMOS EL PROCEDIMIENTO---------------------------------
delimiter //
create procedure cuenta_emp (out var1 int)
begin
select count(*) into var1 from empleado;
end
//
delimiter ;

------------------------------LLAMAMOS EL PROCEDIMIENTO----------------------------

call cuenta_emp(@var1);

Tambien puede utilizar otros nombres de variable cuando llama el procedimiento. Recuerde que en esta se almacena el
resultado del procedimiento.

Call cuenta_emp(@contar);

--------------------------VER EL CONTENIDO DE LA VARIABLE--------------------------

select @var1;

o si utilizo la variable contar:

select @contar;

-------------------------------USAR EL PROCEDIMIENTO-------------------------------

Si vamos a hacer una consulta que nos muestre el promedio del salario de los empleados teniendo en cuenta el
procedimiento cuenta_emp que nos proporciona la cantidad total de empleados almacenado en la variable var1:

Select sum(salario)/@var1 “PROMEDIO” from empleado;


RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

EJEMPLO 2

EL PROCEDIMIENTO MAX_SALARIO CALCULA EL SALARIO MAS ALTO Y LO ALMACENA EN LA VARIABLE MAYOR.

USE EMPRESA;

--------------------------CREAMOS EL PROCEDIMIENTO---------------------------------
delimiter //
create procedure max_salario(out mayor int)
begin
select max(salario) into mayor from empleado;
end
//
delimiter ;

------------------------------LLAMAMOS EL PROCEDIMIENTO----------------------------

Call max_salario(@mayor);

--------------------------VER EL CONTENIDO DE LA VARIABLE--------------------------


select @mayor;

-------------------------------USAR EL PROCEDIMIENTO-------------------------------

UN EJEMPLO SENCILLO ES MOSTRAR EL NOMBRE Y EL SALARIO DE LOS EMPLEADOS QUE ESTAN POR DEBAJO DEL QUE
MAS GANA

Select salario from empleado where salario < @mayor;

EJEMPLO 3

EL SIGUIENTE PROCEDIMIENTO CALCULA LA SUMA DE LOS N PRIMEROS NUMEROS NATURALES Y LA GUARDA


EN LA VARIABLE DE TIPO OUT SUMA.

DELIMITER $$
CREATE PROCEDURE suma_natural (in final integer, out suma integer)
Begin
declare i integer;
set i := 1;
set suma:=0;
Repeat
set suma := suma +i;
set i = i+1;
until i > final
end repeat;
end$$

DELIMITER ;

Ejecutamos el procedimiento: call suma_natural(5,@suma);

Verificamos el valor de la variables suma: Select @suma;


RESUMEN MANUAL DE REFERENCIA MYSQL 5. PROCEDIMIENTOS ALMACENADOS] CAPITULO 19

Ejemplo 4

EL SIGUIENTE PROCEDIMIENTO LLAMADO ACT_COM ACTUALIZA LA COMISION DE LOS EMPLEADOS DEL


DEPARTAMENTO 10 A 200 Y LAS COMISIONES DE LOS EMPLEADOS DE LOS DEMAS DEPARTAMENTOS LAS
PONE EN 0.

mysql>use empresa;

create procedure act_com (in valor integer)


begin
declare variable integer;
if valor = 10 then
set variable =200;
else
set variable =0;
end if;
update empleado set comision = variable where deptno = valor;

al llamar el procedimiento…
mysql>call act_com(30);
se obtiene como resultado que las comisiones de los empleados del departamento 30 se actualiza a 0;

mysql>call act_com(10);
se obtiene como resultado que las comisiones de los empleados del departamento 10 se actualiza a 200;

Das könnte Ihnen auch gefallen