Los procedimientos almacenados y funciones 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 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 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 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 operaciĆ³n se loguea apropiadamente. En tal entorno, las aplicaciones y los usuarios no obtendrĆan ningĆŗn acceso directo a las tablas de la base de datos, sĆ³lo pueden ejectuar algunos procedimientos almacenados.
Los procedimientos almacenados pueden mejorar el rendimiento ya que se necesita enviar menos informaciĆ³n 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 mayorĆa del trabajo se realiza en la parte del servidor y no en el cliente. Considere esto si muchas mĆ”quinas cliente (como servidores Web) se sirven a sĆ³lo 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 caracterĆstica es compartida por los lenguajes de programaciĆ³n modernos que permiten este diseƱo interno, por ejemplo, usando clases. Usando estas caracterĆsticas del lenguaje de programaciĆ³n cliente es beneficioso para el programador incluso fuera del entorno de la base de datos.
Comandos Create Procedure y Create Function
Estos comandos crean una rutina almacenada. Desde MySQL 5.0.3, para crear una rutina,
es necesario tener el permiso CREATE ROUTINE, y los permisos ALTER ROUTINE y EXECUTE se asignan automƔticamente a su creador.
Por defecto, la rutina se asocia con la base de datos actual. Para asociar la rutina explĆcitamente con una base de datos, especifique el nombre como db_name.sp_name al crearlo.
Si el nombre de rutina es el mismo que el nombre de una funciĆ³n de SQL, necesita usar un espacio entre el nombre y el siguiente parĆ©ntesis al definir la rutina, o hay un error de sintaxis. Esto tambiĆ©n es cierto cuando invoca la rutina posteriormente.
La clĆ”usula RETURNS puede especificarse sĆ³lo con FUNCTION, donde es obligatorio. Se usa para indicar el tipo de retorno de la funciĆ³n, y el cuerpo de la funciĆ³n debe contener un comando RETURN value.
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.
Un procedimiento o funciĆ³n se considera “determinista” si siempre produce el mismo resultado para los mismos parĆ”metros de entrada, y “no determinista” en cualquier otro caso. Si no se da ni DETERMINISTIC ni NOT DETERMINISTIC por defecto es NOT DETERMINISTIC.
Varias caracterĆsticas proporcionan informaciĆ³n sobre la naturaleza de los datos usados por la rutina. CONTAINS SQL indica que la rutina no contiene comandos que leen o escriben datos. NO SQL indica que la rutina no contiene comandos SQL. READS SQL DATA indica que la rutina contiene comandos que leen datos, pero no comandos que escriben datos. MODIFIES SQL DATA indica que la rutina contiene comandos que pueden escribir datos. CONTAINS SQL es el valor por defecto si no se dan explĆcitamente ninguna de estas caracterĆsticas.
MySQL almacena la variable de sistema sql_mode que estĆ” en efecto cuando se crea la rutina, y siempre ejecuta la rutina con esta inicializaciĆ³n.
La clĆ”usula COMMENT es una extensiĆ³n de MySQL, y puede usarse para describir el procedimiento almacenado. Esta informaciĆ³n se muestra con los comandos SHOW CREATE PROCEDURE y SHOW CREATE FUNCTION.
MySQL permite a las rutinas que contengan comandos DDL (tales como CREATE y DROP) y comandos de transacciĆ³n SQL (como COMMIT). Esto no lo requiere el estĆ”ndar, y por lo tanto, es especĆfico de la implementaciĆ³n.
Los procedimientos almacenados no pueden usar LOAD DATA INFILE.
Los comandos que retornan un conjunto de resultados no pueden usarse desde una funciĆ³n almacenada. Esto incluye comandos SELECT que no usan INTO para tratar valores de columnas en variables, comandos SHOW y otros comandos como EXPLAIN. Para comandos que pueden determinarse al definir la funciĆ³n para que retornen un conjunto de resultados, aparece un mensaje de error Not allowed to return a result set from a function (ER_SP_NO_RETSET_IN_FUNC). Para comandos que puede determinarse sĆ³lo en tiempo de ejecuciĆ³n si retornan un conjunto de resultados, aparece el error PROCEDURE %s can't return a result set in the given context (ER_SP_BADSELECT).
Ejemplo.
DROP PROCEDURE IF EXISTS getPostsByCategory; DELIMITER $$ CREATE PROCEDURE getPostsByCategory( IN _category VARCHAR(100), IN _language VARCHAR(2), IN _page INT, IN _max INT) BEGIN DECLARE _start INT DEFAULT 0; DECLARE _limit1 INT DEFAULT 0; DECLARE _limit2 INT DEFAULT 0; SET _limit1 = 0; SET _limit2 = _max; IF _page > 0 THEN SET _limit1 = _page * _max - _max; END IF; SELECT COUNT(1) AS total FROM ( SELECT blog_posts.id FROM blog_posts LEFT JOIN blog_re_categories2posts ON (blog_re_categories2posts.postId = blog_posts.id) LEFT JOIN blog_categories ON (blog_categories.id = blog_re_categories2posts.categoryId) WHERE blog_categories.slug = _category GROUP BY blog_posts.id ) AS Result; SELECT title, blog_posts.slug, excerpt, content, author, mainImage, createdAt, day, month, year, blog_posts.language, GROUP_CONCAT(blog_categories.category SEPARATOR ', ') AS categories FROM blog_posts LEFT JOIN blog_re_categories2posts ON (blog_re_categories2posts.postId = blog_posts.id) LEFT JOIN blog_categories ON (blog_categories.id = blog_re_categories2posts.categoryId) WHERE blog_categories.slug = _category AND blog_posts.language = _language AND blog_categories.language = _language AND blog_posts.situation = 'Published' GROUP BY blog_posts.id ORDER BY blog_posts.id DESC LIMIT _limit1, _limit2; END $$ DELIMITER ;
Uso del CASE.
Las sentencias CASE pueden utilizarse para entrar condicionalmente en una lĆ³gica determinada en funciĆ³n del estado de una condiciĆ³n que se cumple. Existen dos tipos de sentencias CASE:
Sentencia case simple: utilizada para entrar en una lĆ³gica determinada en funciĆ³n de un valor literal.
Sentencia case buscada: utilizada para entrar en una lĆ³gica determinada en funciĆ³n del valor de una expresiĆ³n.
La clƔusula WHEN de la sentencia CASE define el valor que, si se cumple, determina el flujo de
control.
Dicho esto las demƔs funciones que vienen dentro del case, dictarƔn que harƔn con la base de datos, como insertar, actualizar o borrar algun dato de la misma, como esto ya lo vimos no habrƔ p
No hay comentarios:
Publicar un comentario