Está en la página 1de 11

TECNOLGICO DE ESTUDIOS SUPERIORES DE TIANGUISTENCO

[APLICACIONES WEB]

[CARRERA] INGENIERO EN SISTEMAS COMPUTACIONALES

[NOMBRE DEL ALUMNO] [Gonzlez, Villamares, Alberto]


[MATRICULA: 200923065]

[GRUPO: 802]

[INVESTIGACIN BIBLIOGRFICA Procedimientos almacenados]

TIANGUISTENCO, MXICO [Junio, 2013]

ndice:
ndice.. 2 Introduccin.... 3 Procedimientos almacenados..... 3 Ventajas de usar SP.. 3 Ejemplo de procedimientos almacenados.. 5 Conclusiones... 10 Bibliografa.. 11

Introduccin:
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 oparaciones 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 ejectuar algunos procedimientos almacenados.

Procedimientos Almacenados
Un procedimiento almacenado (store procedure) no es ms que una secuencia ordenada de instrucciones T-SQL, que pueden recibir y proporcionar parmetros provistos por el usuario y se pueden guardar en el servidor con un nombre, para posteriormente se invocados y ejecutados, por lo regular desde una aplicacin (Escritorio o Web). Desde la versin 2005, se incorpora la posibilidad de utilizar procedimientos almacenados usando el CLR de .NET. Es decir tenemos dos tipos de procedimientos almacenados. Un procedimiento almacenado CLR es una referencia a un mtodo de un ensamble (dll) de .NET Framework que puede aceptar y devolver parmetros suministrados por el usuario. Ventajas de usar SP

Compilacin: La primera vez que se invoca un SP, el motor lo compila y a partir de ah, se sigue usando la versin compilada del mismo, hasta que se modifique o se reinicie el servicio de SQL. Esto significa que se tendr un mejor rendimiento que las consultas directas que usan cadenas con las instrucciones T-SQL, que se compilan cada vez que se invocan. Automatizacin: si tenemos un conjunto de instrucciones T-SQL, las cuales queremos ejecutar de manera ordenada, un SP es la mejor manera de hacerlo. Administracin: cuando realizamos aplicaciones con un gran nmero de lneas de cdigo, y queremos hacer cambios, solo implica modificar un SP y no toda la aplicacin, lo que significa solo cambiamos los SP en el servidor y no tenemos que actualizar la aplicacin en todos los equipos cliente.

Seguridad: una parte importante es que a los usuarios de nuestra aplicacin, solo les proporcionamos los permisos para ejecutar los procedimientos almacenados y no el acceso a todos los objetos de la base. Es decir, si en nuestra aplicacin encuentran una vulnerabilidad como SLQ Injection no se podr explotar ejecutando SQL directamente. Programabilidad: Los SP admiten el uso de variables y estructuras de control como IF, Bucles, Case, etc. adems del manejo de transaccin y permite controlar excepciones. Y cuando trabajamos con SP CLR podemos hacer uso de cualquier lenguaje .NET como lo son C# y VB.NET. Trafico de Red: Pueden reducir el trfico de la red, debido a que se trabaja sobre el motor (en el servidor), y si una operacin incluye hacer un trabajo de lectura primero y en base a eso realizar algunas operaciones, esos datos que se obtienen no viajan por la red.

Los procedimientos almacenados y rutinas se crean con comandos CREATE PROCEDURE y CREATE FUNCTION . Una rutina es un procedimiento o una funcin. Un procedimiento se invoca usando un comando CALL , y slo puede pasar valores usando variables de salida. Una funcin puede llamarse desde dentro de un comando como cualquier otra funcin (esto es, invocando el nombre de la funcin), y puede retornar un valor escalar. Las rutinas almacenadas pueden llamar otras rutinas almacenadas. Desde MySQL 5.0.1, los procedimientos almacenadoso funciones se asocian con una base de datos. Esto tiene varias implicaciones: Cuando se invoca la rutina, se realiza implcitamente 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 o funciones f esto se asocia con la base de datos test, puede decir CALL test.p() o test.f(). Cuando se borra una base de datos, todos los procedimientos almacenados asociados con ella tambin 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.) MySQL soporta la extensin muy til que permite el uso de comandos regulares SELECT (esto es, sin usar cursores o variables locales) dentro de los procedimientos almacenados. El conjunto de resultados de estas consultas se enva diractamente al cliente. Comandos SELECT mltiples generan varios conjuntos de resultados, as que el cliente debe usar una biblioteca cliente de MySQL que soporte conjuntos de resultados mltiples. Esto significa que el cliente debe usar una biblioteca cliente de MySQL como mnimos desde 4.1.

Ejemplo de un procedimiento almacenado.


CREATE PROCEDURE [dbo].[GetAllEmployees] -- Add the parameters for the stored procedure here @LastName nvarchar(50), @FirstName nvarchar(50) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT LastName, FirstName, Title FROM dbo.Employees WHERE FirstName = @FirstName AND LastName = @LastName END

Selecciona las columnas LastName, FirstName y Title mientras FirstName y LastName sean igual a las entradas, una forma de ejecutar este cdigo seria:
EXEC dbo.GetAllEmployees 'Davolio', 'Nancy' o CALL GetAllEmployees ('Davolio', 'Nancy')

He aqu otro ejemplo:


CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertarDatos`(IN Codigo INT, Nombres VARCHAR( 50 ), Cargo VARCHAR( 50 ), Departamento VARCHAR( 50 ), Jefe VARCHAR( 50 )) READS SQL DATA BEGIN DECLARE error INT; START TRANSACTION; INSERT INTO empleado VALUES(Codigo, Nombres, Cargo, Departamento, Jefe); SET error=(SELECT @error); IF(error=0)THEN ROLLBACK; ELSE COMMIT; END IF; END$$

Este es un registro de un empleado y se mandara a traer as: CALL InsertarDatos(?,?,?,?,?) Otro ejemplo para actualizar un dato:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ModificarDatos`(IN CodigoM INT, NombresM VARCHAR(50), CargoM VARCHAR(50), DepartamentoM VARCHAR(50), JefeM VARCHAR(50))

BEGIN DECLARE error INT; START TRANSACTION; UPDATE empleado SET Nombres=NombresM, Cargo=CargoM, Departamento=DepartamentoM, Jefe=JefeM WHERE Codigo=CodigoM; SET error=(SELECT @error); IF(error=0)THEN ROLLBACK; ELSE COMMIT; END IF; END$$

CALL ModificarDatos(?,?,?,?,?) Y otro para eliminar datos que sera:


CREATE DEFINER=`root`@`localhost` PROCEDURE `BorrarDatos`(IN CodigoB INT) READS SQL DATA BEGIN DECLARE error INT; START TRANSACTION; DELETE FROM empleado WHERE Codigo=CodigoB; SET error=(SELECT @error); IF(error=0) THEN ROLLBACK; ELSE COMMIT; END IF; END$$

CALL BorrarDatos(?) Este sera un ejemplo combinado con java: Esta sera la clase conexin:
package conexionDB; import java.sql.Connection; public class ConexionMySQL { public static Connection con_mysql; public static Connection conectar(String pHost, String pUser, String pPassword, String pDataBase) throws Exception { try { String databaseURL = "jdbc:mysql://" + pHost + "/" + pDataBase; Class.forName("com.mysql.jdbc.Driver");

con_mysql = java.sql.DriverManager.getConnection(databaseURL, pUser, pPassword); //System.out.println("Conexion con MySQL Establecida.."); } catch (Exception e) { e.printStackTrace(); throw new Exception(e); } return con_mysql; } }

Esta sera la clase que ejecutara el procedimiento almacenado:


// imports necesarios import conexionDB.ConexionMySQL; import java.sql.CallableStatement; . . Connection connMY = null; try{ // creamos la conexion connMY = ConexionMySQL.conectar("192.168.1.100", "sa", "*******", "devtroce"); // establecemos que no sea autocommit, // asi controlamos la transaccion de manera manual connMY.setAutoCommit(false); /* instanciamos el objeto callable statement * que usaremos para invocar el SP * La cantidad de "?" determina la cantidad * parametros que recibe el procedimiento */ CallableStatement prcProcedimientoAlmacenado = connMY.prepareCall("{ call NuestroProcedimientoAlmacenado(?,?,?) }"); // cargar parametros al SP prcProcedimientoAlmacenado.setInt("pParametro1", 1); prcProcedimientoAlmacenado.setString("pParametro2", "Devtroce.com"); prcProcedimientoAlmacenado.setInt("pParametro3", 49); // ejecutar el SP prcProcedimientoAlmacenado.execute(); // confirmar si se ejecuto sin errores connMY.commit(); } catch (Exception e) { // deshacer la ejecucion en caso de error connMY.rollback(); // informar por consola e.printStackTrace(); } finally { // cerrar la conexion connMY.close(); }

Este sera el procedimiento almacenado:


CREATE TABLE devtroce( id int NOT NULL, campo2 varchar(50) NOT NULL,

campo3 int NOT NULL ) ON PRIMARY CREATE PROCEDURE NuestroProcedimientoAlmacenado @id int, @campo2 varchar(50), @campo3 int AS BEGIN INSERT INTO devtroce VALUES ( @id, @campo2, @campo3); END

Este sera un ejemplo con java netbeans y consola:


package jcproc; import java.sql.*; /** * @web http://www.jc-mouse.net/ * @author Mouse */ public class database { /* DATOS PARA LA CONEXION */ private String bd = "BASE_DE_DATOS"; private String login = "USUARIO"; private String password = "PASSWORD"; private String url = "jdbc:mysql://localhost/"+bd; private Connection conn = null; //_______________________________________________________________________ ____________ Soy una barra separadora //Constructor de la clase que se conecta a la base de datos una vez que se crea la instancia public database(){ try{ Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url,login,password); }catch(SQLException e){ System.out.println(e); }catch(ClassNotFoundException e){ System.out.println(e); } } //_______________________________________________________________________ ____________ Soy una barra separadora /* FUNCION PARA LLAMAR A UN PROCEDIMIENTO ALMACENADO * INPUT: * nombre = tipo string * anio_nacimiento = tipo entero * OUTPUT: * String */ public String procedure(String nombre, int anio_nacimiento) { String resultado=null; try {

// se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ? CallableStatement proc = conn.prepareCall(" CALL registrar_jugador(?,?,?) "); //se cargan los parametros de entrada proc.setString("nombre", nombre);//Tipo String proc.setInt("anio_nac", anio_nacimiento);//Tipo entero // parametros de salida proc.registerOutParameter("resultado", Types.VARCHAR);//Tipo String // Se ejecuta el procedimiento almacenado proc.execute(); // devuelve el valor del parametro de salida del procedimiento resultado = proc.getString("resultado"); } catch (Exception e) { System.out.println(e); } return resultado; } //_______________________________________________________________________ ____________ Soy una barra separadora }

Este sera el procedimiento almacenado:


DELIMITER $ CREATE PROCEDURE registrar_jugador(IN nombre varchar(60) , IN anio_nac INT, OUT resultado TEXT) BEGIN DECLARE edad int ; DECLARE categoria char(20) ; -- obtiene la edad del jugador SET edad = ( DATE_FORMAT(now() ,'%Y') - anio_nac ); -- dependiendo de la edad se registra al jugador en diferentes categorias CASE WHEN edad=18 OR edad=19 OR edad=20 THEN SET categoria = 'Sub 20' ; WHEN edad=21 OR edad=22 OR edad=23 THEN SET categoria = 'Sub 22' ; ELSE SET categoria = 'Sin categoria'; END CASE ; INSERT INTO jugador(nombre, anio_nac, categoria) VALUES( nombre, anio_nac , categoria ); -- Cuando se termina de registrar al jugador, se devuelve una respuesta en formato de texto SET resultado = CONCAT( 'Jugador ', nombre, ' de ' , edad , ' aos registrado en categoria [' , categoria, ']' ); END $ DELIMITER ;

Este sera la tabla:


CREATE TABLE jugador ( id int(2) NOT NULL auto_increment, nombre varchar(60) NOT NULL, anio_nac int(4) default NULL, categoria varchar(20) default NULL,

PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

Conclusiones:
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.

Cybergrafa:
Copyright 1997-2007 MySQL AB , Desconocido; recuperado de:

http://manuales.guebs.com/mysql-5.0/
Perfil: JC Mouse, procedimientos en MYSQL , recuperado de:

http://www.jc-mouse.net/base-de-datos
Usuario: tatito, programacin web, recuperado de:

http://pabletoreto.blogspot.mx

También podría gustarte