Sei sulla pagina 1di 35

Diseo y Administracin de Bases de Datos II Ing.

Luis Reyes

DBD2 Ing. Luis Reyes

Que son Procedimientos Almacenados?


Un procedimiento almacenado (stored procedure) es

un programa (o procedimiento) el cual es almacenado fsicamente en una base de datos.


Un procedimiento almacenado es un conjunto de

sentencias SQL y de control de flujo


Generalmente son escritos en un lenguaje de bases de

datos propietario, es decir, cada gestor de base de datos posee su propio lenguaje, por lo que es recomendable revisar el manual del SGBD para conocer la sintaxis.

DBD2 Ing. Luis Reyes

...Procedimientos Almacenados
Una vez creado un procedimiento almacenado, se

puede invocar directamente desde una aplicacin, o sustituir el nombre de una tabla o vista, por el nombre de procedimiento en clusulas SELECT.
Los procedimientos almacenados pueden recibir

parmetros de entrada y retornar valores a la aplicacin.

DBD2 Ing. Luis Reyes

...Procedimientos Almacenados Como se puede apreciar los Sistemas de Bases de Datos ofrecen a desarrolladores, administradores y usuarios una gama muy completa de herramientas que permiten garantizar la integridad, consistencia, confidencialidad y en general seguridad de la informacin almacenada y con un elemento muy importante a favor:
Las lneas de cdigo que se requieren por parte del

implementador son muy pocas, en ocasiones solo basta con una sencilla sentencia para obligar al DBMS a controlar y mantener las restricciones necesarias
DBD2 Ing. Luis Reyes

Beneficios de los Procedimientos Almacenados


Simplifican la ejecucin de tareas repetitivas Corren ms rpido que las mismas instrucciones ejecutadas en

forma interactiva Reducen el trfico a travs de la red Pueden capturar errores antes que ellos puedan entrar a la base de datos Establece consistencia porque ejecuta las tareas de la misma forma Permite el desarrollo modular de aplicaciones Ayuda a proveer seguridad Puede forzar reglas y defaults complejos de los negocios
DBD2 Ing. Luis Reyes

*Ventajas
La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una peticin de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado.
Como tal, posee acceso directo a los datos que necesita manipular y solo necesita enviar sus

resultados de regreso al usuario, deshacindose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes.
DBD2 Ing. Luis Reyes

*Rendimiento
Al ser ejecutados por el motor de base de datos ofrecen un Rendimiento inmejorable ya que no es necesario transportar datos a ninguna parte.
Cualquier proceso externo tiene una penalidad de tiempo adicional dada por el transporte de datos. Los procedimientos almacenados son analizados y optimizados en el momento de su creacin Ya se han resuelto las referencias a los objetos referenciados en el procedimiento almacenado
DBD2 Ing. Luis Reyes

*Centralizacin
Al formar parte de la base de datos los procedimientos

almacenados estn en un lugar centralizado y pueden ser ejecutados por cualquier aplicacin que tenga acceso a la misma. aplicacin, es posible que no est disponible en todos los lugares que se lo necesite, por ejemplo, el sistema operativo unix. procedimientos almacenados estn siempre disponibles.
DBD2 Ing. Luis Reyes

Si un determinado proceso es desarrollo con una

Los

Transact-SQL (concepto para prxima caracterstica)


(T-SQL). Transact-SQL es una extensin del lenguaje SQL,

propiedad de Microsoft y Sybase.

Transact SQL es el lenguaje de programacin que proporciona

SQL Server para ampliar SQL con los elementos caractersticos de los lenguajes de programacin: variables, sentencias de control de flujo, bucles, etc. Microsoft SQL Server.

La implementacin de Transact-SQL funciona en los productos En tanto, Sybase utiliza el lenguaje en su Adaptative Server

Enterprise, el sucesor de Sybase SQL Server.

DBD2 Ing. Luis Reyes

*Reduccin del trfico de red


Una sentencia formada por decenas, cientos o incluso miles de lneas de cdigo Transact-SQL puede escribirse como un procedimiento almacenado en el servidor y ejecutarse simplemente mediante el nombre de dicho procedimiento, en lugar de enviar todas las lneas de cdigo por la red desde el cliente hasta el servidor.

DBD2 Ing. Luis Reyes

*Seguridad
Los procedimientos almacenados facilitan algunas tareas de administracin de seguridad y asignacin de permisos.
Por ejemplo:
Se puede conceder permiso a un usuario para ejecutar un

determinado procedimiento almacenado, aunque el usuario no disponga de los permisos necesarios sobre los objetos afectados por las acciones individuales de dicho procedimiento.
DBD2 Ing. Luis Reyes

*Encapsulacin
Los procedimientos almacenados encapsulan gran parte de la lgica de los datos a las aplicaciones que los utilizan.
Por ejemplo:
Una

aplicacin puede llamar al procedimiento almacenado spEliminarProveedor sin conocer cmo funciona internamente ste proceso (transacciones e instrucciones Transact-SQL utilizadas, tablas afectadas, etc.)
DBD2 Ing. Luis Reyes

*Desventaja importante
Esclavitud:
Los procedimientos almacenados nos esclavizan al

motor de base de datos. Una base de datos con muchos procedimientos almacenados es prcticamente imposible de migrar a otro motor.

Lo anterior se debe, principalmente, a que los lenguajes de procedimientos almacenados de distintos fabricantes no son compatibles entre s.
DBD2 Ing. Luis Reyes

Conclusin
Teniendo en cuenta las ventajas y desventajas es

aconsejable no abusar de los procedimientos almacenados y utilizarlos slo cuando no queda otra alternativa.

DBD2 Ing. Luis Reyes

CREACION
CREATE PROCEDURE sp_name ([parametros[,...]]) [caracteristicas ...] cuerpodelarutina

Donde Parmetros puede ser:


IN : indica que son parmetros de entrada OUT: parmetros de salida. INOUT parmetros de entrada y de salida
DBD2 Ing. Luis Reyes

Ejemplo
Para MySQL, sera de la siguiente manera:
create procedure proc_update_titles begin
update titles set price = price * $0.95 where total_sales < 3000

end

DBD2 Ing. Luis Reyes

Ejemplo
Si fuera para SQL*Server, entonces se deber escribir de la siguiente forma:

create proc proc_update_titles as update titles set price = price * $0.95 where total_sales < 3000 return
Esto significa que habra que investigar segn

el SGBD en el que trabajemos, cual es la sintaxis

DBD2 Ing. Luis Reyes

ELIMINACION
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name No es difcil deducir cual es la utilidad de esta instruccin, esta sentencia tiene como finalidad el eliminar el procedimiento almacenado el cual se le pasa como parmetro.

DBD2 Ing. Luis Reyes

Ejemplo
En el caso de MySQL, esta sera la forma de borrar un procedimiento:

Drop procedure proc_update_titles


Si estamos en SQL*Server la forma de hacerlo sera como sigue:

Drop proc proc_update_titles

DBD2 Ing. Luis Reyes

SEGMENTO DE CODIGO
BEGIN [statement_list] END
La utilizacin de estas dos instrucciones en conjunto dan lugar al cuerpo del procedimiento, donde se almacenan la o las diferentes instrucciones que componen a esta rutina

DBD2 Ing. Luis Reyes

CREACION DE VARIABLES
DECLARE var_name[,...] type [DEFAULT value]
Esta sentencia se utiliza para la declaracin de variables dentro del procedimiento almacenado,

as como handlers y cursores.

Esta instruccin puede usarse dentro de las etiquetas begin y end las cuales engloban el

cuerpo de instrucciones del procedimiento, tambin es posible asignar un tipo de variable y un valor default.

DBD2 Ing. Luis Reyes

INSTRUCCIN SELECT
SELECT col_name[,...] INTO var_name[,...] table_expr
Esta sentencia es especialmente til ya que inserta en las variables que se le indican los resultados del SELECT, es importante tener en cuenta que no almacena una estructura bidimensional, si no solamente una o varias variables, es por ello que es necesario que las consultas solamente tengan un solo registro como el ejemplo siguiente. SELECT id, data INTO x, y FROM test.t1 LIMIT 1;
DBD2 Ing. Luis Reyes

SENTENCIA IF
IF condition THEN Sentencias1 ELSE Sentencias2 END IF
IF implementa un constructor condicional bsico. Si condition se evala a cierto, el comando SQL

correspondiente sentencias1 se ejecuta. Si no coincide ninguna condicin se ejecuta el comando listado en la clusula ELSE. Sentencias2 puede consistir en varios comandos.

DBD2 Ing. Luis Reyes

SENTENCIA CASE
CASE condition THEN ELSE END CASE
El comando CASE para procedimientos almacenados implementa un constructor condicional complejo. Si una condition se evala a cierto, el comando SQL correspondiente se ejecuta. Si no coincide ninguna condicin de bsqueda, el comando en la clusula ELSE se ejecuta.
DBD2 Ing. Luis Reyes

SENTENCIA WHILE
WHILE condition DO sentencias END WHILE
Los DBMS soportan varios tipo de bucles y con ellos muchos tipos de control sobre ellos. Los comandos dentro del WHILE se repiten mientras la condicin condition es cierta.
DBD2 Ing. Luis Reyes

Ejemplo
CREATE PROCEDURE procedure1 (IN parameter1 INTEGER) BEGIN DECLARE variable1 CHAR(10); IF parameter1 = 17 THEN SET variable1 = 'birds'; ELSE SET variable1 = 'beasts'; END IF; INSERT INTO table1 VALUES (variable1); END;
Este procedimiento recibe un dato por el parmetro parameter1, si el valor es 17 entonces asigna a la variable variable1 el valor bird sino ser el valor beasts, luego lo agrega en la tabla1 DBD2 Ing. Luis Reyes

Ejemplo

delimiter // CREATE procedure introducePersona(IN edad int, IN nombre varchar(50)) begin IF edad < 18 then INSERT INTO ninos VALUES(edad,nombre); else INSERT INTO adultos VALUES(edad,nombre); end IF; end; //

Nota: la lnea que dice delimiter // permitir reemplazar momentneamente el ; que normalmente se usa como fin de instruccin

Evala el parmetro edad, si el valor es menor a 18 entonces agrega a la tabla ninos los valores de los parmetros edad y nombre, sino agregar esos datos pero en la tabla adultos DBD2 Ing. Luis Reyes

Ejemplo
DELIMITER //

Nota: el smbolo @ a la izquierda de la variable es equivalente decir que es una variable global pblica como es conocida en otros lenguajes.

CREATE PROCEDURE ejemplo (num INTEGER) BEGIN INSERT INTO tabla1 VALUES(NULL, num+num, num*num);

# retorna el ltimo valor generado automticamente que se insert # en una columna AUTO_INCREMENT. SET @ultimo := LAST_INSERT_ID();
INSERT INTO tabla2 VALUES (@ultimo, @ultimo+@ultimo, @ultimo*@ultimo);

END //
DELIMITER ;

Se agrega a la tabla tabla1 el valor nulo, la suma del parmetro num y el producto del mismo parmetro, posteriormente hacemos lo mismo pero con el valor del campo auto incrementado. DBD2 Ing. Luis Reyes

Ejemplo usando:

IF .. THEN .. ELSE

delimiter // CREATE procedure miProc(IN p1 int) begin declare miVar int; SET miVar = p1 +1 ; IF miVar = 12 then INSERT INTO lista VALUES(55555); else INSERT INTO lista VALUES(7665); end IF; end; //
DBD2 Ing. Luis Reyes

Ejemplo usando: Switch


delimiter // CREATE procedure miProc (IN p1 int) begin declare var int ; SET var = p1 +2 ; case var
when 2 then

/ Case

INSERT INTO lista VALUES (66666);


when 3 then

INSERT INTO lista VALUES (4545665);


else

INSERT INTO lista VALUES (77777777);


end case;

end; //

DBD2 Ing. Luis Reyes

Ejemplo usando: WHILE


delimiter // CREATE procedure p14() begin declare v int; SET v = 0; while v < 5 do
INSERT INTO lista VALUES (v); SET v = v +1 ;

end while; end; //

DBD2 Ing. Luis Reyes

Ejemplo usando: Uso


delimiter // CREATE procedure p15() begin

de REPEAT

declare v int; SET v = 20; repeat INSERT INTO lista VALUES(v); SET v = v + 1; Nota: en este caso, la instruccin until v <= 1 INSERT se hace por lo menos 1 vez. end repeat;

end; //

DBD2 Ing. Luis Reyes

Ejemplo usando: LOOP


delimiter // CREATE procedure p16() begin declare v int; SET v = 0; loop_label : loop

LABEL

En este caso usamos la instruccin LOOP, pero en este caso se le ha asignado un nombre de etiqueta

INSERT INTO lista VALUES (v); SET v = v + 1; IF v <= 5 then Si la condicin se cumple, entonces el lazo se interrumpe leave loop_label; end IF;

end loop; end; //

DBD2 Ing. Luis Reyes

INVOCAR PROCEDIMIENTOS
CALL sp_name([parameter[,...]])
El comando

CALL invoca un procedimiento

definido previamente con CREATE PROCEDURE.

CALL puede pasar valores al llamador usando


parmetros declarados como OUT o INOUT

DBD2 Ing. Luis Reyes

Ejecutar procedimientos
Para MySQL la llamada a un procedimiento sera: Call proc_update_title
Si estuviera en SQL*Server, sera execute proc_update_titles

DBD2 Ing. Luis Reyes

Potrebbero piacerti anche