Un stored procedure es una coleccin de sentencias del Transact-SQL las cuales organizadas lgicamente resuelven algunas de las operaciones transaccionales que requieren los usuarios, estos procedimientos se almacenan en la base de datos. Los procedimientos almacenados soportan el empleo de variables declaradas por el usuario, sentencias para toma de decisiones entre otras caractersticas. PROCEDIMIENTOS ALMACENADOS Documento elaborado por: M.E. Gabriela Aguilar Ortiz Procedimientos del sistema, son los que se encuentran almacenados en la base de datos master y algunas en las bases de datos de usuario, estos procedimientos almacenados brindan informacin acerca de los datos y caractersticas del servidor. Procedimientos locales, son los procedimientos almacenados en una base de datos. Procedimientos temporales, son procedimientos locales, dependiendo si se desea que sea un procedimiento global a todas las conexiones o local a la conexin que lo define. Procedimientos remotos, son procedimientos almacenados en servidores distribuidos. TIPOS DE PROCEDIMIENTOS ALMACENADOS Documento elaborado por: M.E. Gabriela Aguilar Ortiz Aceptar parmetros de entrada y devolver varios valores en forma de parmetros de salida al lote o al procedimiento que realiza la llamada. Contener instrucciones de programacin que realicen operaciones en la base de datos, incluidas las llamadas a otros procedimientos. Devolver un valor de estado que indica si la operacin se ha realizado correctamente o habido un error (y el motivo del mismo). PRINCIPALES CARACTERSTICAS. Documento elaborado por: M.E. Gabriela Aguilar Ortiz Permiten una ejecucin ms rpida, ya que los procedimientos son analizados y optimizados en el momento de su creacin, y es posible utilizar una versin del procedimiento que se encuentra en la memoria despus de que se ejecute por primera vez. Pueden reducir el trfico de red. Pueden utilizarse como mecanismo de seguridad, ya que se puede conceder permisos a los usuarios para ejecutar un procedimiento almacenado, incluso si no cuentan con permiso para ejecutar directamente las instrucciones del procedimiento. PRINCIPALES CARACTERSTICAS. Documento elaborado por: M.E. Gabriela Aguilar Ortiz 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 ejectuar algunos procedimientos almacenados. UTILIDAD DE LOS PROCEDIMIENTOS ALMACENADOS Documento elaborado por: M.E. Gabriela Aguilar Ortiz 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. UTILIDAD DE LOS PROCEDIMIENTOS ALMACENADOS Documento elaborado por: M.E. Gabriela Aguilar Ortiz 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. SINTAXIS Documento elaborado por: M.E. Gabriela Aguilar Ortiz Los procedimientos almacenados requieren la tabla proc en la base de datos mysql. Esta tabla se crea durante la instalacin de MySQL. Las funciones almacenadas requieren la tabla func en la base de datos mysql. Esta tabla se crea durante la instalacin de MySQL. PROCEDIMIENTOS ALMACENADOS Y LA TABLA DE PERMISOS Documento elaborado por: M.E. Gabriela Aguilar Ortiz CREATE PROCEDURE sp_name ([parameter[,...]]) [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 PROCEDIMIENTOS mysql> DELIMITER | mysql> CREATE PROCEDURE proc1 (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM entidades; -> END -> DELIMITER | Query OK, 0 rows affected (0.37 sec) mysql> CALL proc1(@a); -> DELIMITER | Query OK, 0 rows affected (1.90 sec) mysql> SELECT @a; -> DELIMITER | +------+ | @a | +------+ | 32 | +------+ 1 row in set (0.00 sec) mysql> DELIMITER | mysql> CREATE PROCEDURE hdemo() -> BEGIN -> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; -> SET @x = 1; -> INSERT INTO entidades (id_entidad) VALUES(00); -> SET @x = 2; -> INSERT INTO entidades (id_entidad) VALUES(99); -> SET @x = 3; -> END; -> DELIMITER | Query OK, 0 rows affected (0.09 sec) mysql> CALL hdemo(); -> DELIMITER | mysql> SELECT @X; +------+ | @X | +------+ | 3 | +------+ mysql> DELIMITER | mysql> CREATE PROCEDURE proc_repite(param1 INT) -> BEGIN -> SET @x = 0; -> REPEAT SET @x = @x + 1: -> UNTIL @x > param1 -> END REPEAT; -> END -> END; -> DELIMITER | Query OK, 0 rows affected (0.06 sec) mysql> CALL proc_repite(1000); -> DELIMITER | mysql> SELECT @x; +------+ | @x | +------+ | 1001 | +------+ 1 row in set (0.00 sec) Documento elaborado por: M.E. Gabriela Aguilar Ortiz 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 FUNCIONES mysql> DELIMITER | mysql> CREATE FUNCTION funcion_p1(cadena TEXT) RETURNS INT -> BEGIN -> IF SUBSTRING(cadena,3,1) = A THEN RETURN 1; ELSE RETURN 0; -> END IF; -> END -> DELIMITER | Query OK, 0 rows affected (0.05 sec) mysql> SELECT funcion_p1(XXXAAADDD); -> DELIMITER |; +------------------------+ | funcion_p1(XXXAAADDD)| +------------------------+ | 0 | +------------------------+ 1 row in set (0.00 sec) mysql> SELECT funcion_p1(XXaAAADDD); -> DELIMITER |; +------------------------+ | funcion_p1(XXaAAADDD)| +------------------------+ | 1 | +------------------------+ 1 row in set (0.00 sec)