miƩrcoles, 9 de mayo de 2018

Prodecimientos MySQL



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

Ejercicios de macros 03/05/2018 - 17/05/2018

 RESTA  http://blogdegraficacion.blogspot.mx/ restas macro p, s     mov al, p     sub al, s     add al, 30h     mov resta, a...