Herramientas de usuario

Herramientas del sitio


bloque3:programacion

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
bloque3:programacion [2021/11/15 18:33] – [Ejecutar procedimiento y funciones] fernandobloque3:programacion [2024/09/16 15:37] (actual) – editor externo 127.0.0.1
Línea 148: Línea 148:
 -- para dar de alta la nueva pista asumiendo que se trata de una  -- para dar de alta la nueva pista asumiendo que se trata de una 
 -- pista abierta al público -- pista abierta al público
 +
 CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), p_tipo VARCHAR(255),  CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), p_tipo VARCHAR(255), 
     p_precio FLOAT, p_id_polideportivo INT)     p_precio FLOAT, p_id_polideportivo INT)
-procedimiento: BEGIN +BEGIN
-    DECLARE existe_polideportivo TINYINT(1); +
- +
-    SET existe_polideportivo = (SELECT COUNT(*) FROM polideportivos +
-                                WHERE id = p_id_polideportivo); +
-    IF existe_polideportivo = 0 THEN +
-        LEAVE procedimiento; +
-    END IF;+
  
     INSERT INTO pistas (codigo, tipo, precio, id_polideportivo)     INSERT INTO pistas (codigo, tipo, precio, id_polideportivo)
Línea 164: Línea 158:
         VALUES (LAST_INSERT_ID(), TRUE);         VALUES (LAST_INSERT_ID(), TRUE);
  
-END procedimiento;+END;
 </code> </code>
  
Línea 189: Línea 183:
  
 END; END;
 +</code>
 +
 +==== Salir de un procedimiento: Etiquetas ====
 +
 +Si deseo terminar un procedimiento en un momento dado, puedo usar la sentencia ''LEAVE''. Como podemos querer salir o terminar también un bucle, es necesario poner etiquetas a los bloques de código para indicar de qué bloque queremos salir.
 +<code sql>
 +
 +-- Procedimiento para dar de alta una nueva pista en un polideportivo 
 +-- determinado. Se pasan como parámetros todos los datos necesarios 
 +-- para dar de alta la nueva pista asumiendo que se trata de una 
 +-- pista abierta al público
 +
 +CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), p_tipo VARCHAR(255), 
 +    p_precio FLOAT, p_id_polideportivo INT)
 +    
 +procedimiento: BEGIN
 +    DECLARE existe_polideportivo TINYINT(1);
 +
 +    SET existe_polideportivo = (SELECT COUNT(*) FROM polideportivos
 +                                WHERE id = p_id_polideportivo);
 +    IF existe_polideportivo = 0 THEN
 +        LEAVE procedimiento; -- indico el bloque del que quiero salir
 +    END IF;
 +
 +    INSERT INTO pistas (codigo, tipo, precio, id_polideportivo)
 +        VALUES (p_codigo, p_tipo, p_precio, p_id_polideportivo);
 +    INSERT INTO pistas_abiertas (id_pista, operativa)
 +        VALUES (LAST_INSERT_ID(), TRUE);
 +
 +END procedimiento;
 +
 +</code>
 +
 +==== Función LAST_INSERT_ID() ====
 +Cuando queremos ejecutar varias operaciones que modifican la base de datos es recomendable agruparlas en una //Transacción//. Aparte de esto, es posible que al una inserción en una tabla cuya clave primaria es ''AUTO_INCREMENT'' necesitemos conocer el valor del //id// generado, para poder utilizarlo en la siguiente inserción en caso de que las tablas estén relacionadas.
 +
 +La función ''LAST_INSERT_ID()'' nos devuelve el valor del último campo ''AUTO_INCREMENT'' generado en nuestra sesión, manteniendo el control concurrente de diferentes usuarios a la misma base de datos:
 +
 +<code sql>
 +-- Se desea insertar una nueva pista abierta. Para ello debo
 +-- insertar la pista en la tabla pistas, y también en la tabla
 +-- pistas abiertas:
 +
 +-- Primero hago la inserción en la tabla padre: pistas
 +
 +    INSERT INTO pistas (codigo, tipo, precio, id_polideportivo)
 +        VALUES (p_codigo, p_tipo, p_precio, p_id_polideportivo);
 +
 +-- Después hago la inserción en la tabla hija: pistas_abiertas
 +-- En este caso necesito conocer el id que se generó en la inserción
 +-- anterior, ya que es clave ajena en esta tabla
 +
 +    INSERT INTO pistas_abiertas (id_pista, operativa)
 +        VALUES (LAST_INSERT_ID(), TRUE);
 +
 </code> </code>
 ==== Ejecutar procedimientos y funciones ==== ==== Ejecutar procedimientos y funciones ====
Línea 207: Línea 256:
  
 <code sql> <code sql>
--- Parámetro OUT 
- 
 CREATE PROCEDURE cantidad_pedidos_por_estado (IN  p_estado_pedido VARCHAR(25) CREATE PROCEDURE cantidad_pedidos_por_estado (IN  p_estado_pedido VARCHAR(25)
                                                , OUT total INT)                                                , OUT total INT)
Línea 216: Línea 263:
  FROM pedidos  FROM pedidos
  WHERE estado = p_estado_pedido;  WHERE estado = p_estado_pedido;
-END$$+END;
  
 CALL cantidad_pedidos_por_estado('Enviado',@total); CALL cantidad_pedidos_por_estado('Enviado',@total);
Línea 224: Línea 271:
 ==== Ventajas ==== ==== Ventajas ====
  
-Resultan útiles, por ejemplo, en casos en los que varias aplicaciones diferentes trabajan sobre la misma Base de Datos y deben ejecutar el mismo código. En vez de escribir ese código para cada una de las diferentes aplicaciones, se puede escribir una sola vez en el servidor y ejecutarse desde las diferentes aplicaciones clientes+  * Resultan útiles, por ejemplo, en casos en los que varias aplicaciones diferentes trabajan sobre la misma Base de Datos y deben ejecutar el mismo código. En vez de escribir ese código para cada una de las diferentes aplicaciones, se puede escribir una sola vez en el servidor y ejecutarse desde las diferentes aplicaciones clientes.
- +
-Además, aportan mayor seguridad puesto que las aplicaciones o usuarios no necesitan acceder directamente a la información de la Base de Datos, sino que solamente acceden a ejecutar determinados procedimientos o funciones.+
  
-Y por último, se reduce el tráfico de red generado entre la aplicación cliente y el servidor al no tener que mandar multiples consultas, sino tan solo el nombre de un procedimiento o función.+  * Además, aportan mayor seguridad puesto que las aplicaciones o usuarios no necesitan acceder directamente a la información de la Base de Datos, sino que solamente acceden a ejecutar determinados procedimientos o funciones. 
 +  
 +  * Y por último, se reduce el tráfico de red generado entre la aplicación cliente y el servidor al no tener que mandar multiples consultas, sino tan solo el nombre de un procedimiento o función.
 ==== Desventajas ==== ==== Desventajas ====
  
-Como principal desventaja se podría destacar la simplicidad del código que se puede utilizar en su implementación, puesto que no se pueden combinar con otros lenguajes más potentes como Java, C++, . . . +  * Como principal desventaja se podría destacar la simplicidad del código que se puede utilizar en su implementación, puesto que no se pueden combinar con otros lenguajes más potentes como Java, C++, . . . 
- +  
- +  
-Además, resultan bastante complicados de escribir y mantener puesto que requieren conocimientos bastante precisos que no todos los programadores suelen tener.+  Además, resultan bastante complicados de escribir y mantener puesto que requieren conocimientos bastante precisos que no todos los programadores suelen tener.  
 ==== Creación de scripts ==== ==== Creación de scripts ====
  
-A la hora de implementar nuevos procedimientos y funciones hay que tener en cuenta algunas cuestiones. Puesto que el delimitador ';' se utiliza para finalizar cualquier orden sobre el motor MySQL, éste debe ser modificado mientras se implementa cualquier procedimiento o función, puesto que    cualquier instrucción //SQL// que forme parte del código, sería interpretada de forma independiente.+A la hora de implementar nuevos procedimientos y funciones hay que tener en cuenta algunas cuestiones. Puesto que el delimitador '';'' se utiliza para finalizar cualquier orden sobre el motor MySQL, éste debe ser modificado mientras se implementa cualquier procedimiento o función, ya que cualquier instrucción //SQL// que forme parte del código, sería interpretada de forma independiente.
  
 Así, la forma habitual de escribir procedimientos o funciones es a través de la creación de scripts //SQL// utilizando la orden ''DELIMITER'' que permite modificar el delimitador de fin de orden en MySQL. Por ejemplo, el código que se muestra a continuación permitiría crear un procedimiento desde un script (o bien pegando el código directamente en la consola). El delimitador de fin de orden se modifica al inicio del procedimiento y se vuelve a restaurar al final de la implementación de éste. Así, la forma habitual de escribir procedimientos o funciones es a través de la creación de scripts //SQL// utilizando la orden ''DELIMITER'' que permite modificar el delimitador de fin de orden en MySQL. Por ejemplo, el código que se muestra a continuación permitiría crear un procedimiento desde un script (o bien pegando el código directamente en la consola). El delimitador de fin de orden se modifica al inicio del procedimiento y se vuelve a restaurar al final de la implementación de éste.
Línea 243: Línea 290:
 <code sql> <code sql>
 DELIMITER | DELIMITER |
 +
 CREATE PROCEDURE ver_pistas() CREATE PROCEDURE ver_pistas()
 BEGIN BEGIN
     SELECT * FROM pistas;     SELECT * FROM pistas;
-END +END | 
-|+
 DELIMITER ; DELIMITER ;
 </code> </code>
  
-Una vez creado el procedimiento o función, desde un script o directamente en la consola, la forma de invocarlo es a través de la instrucción ''CALL'' seguido del nombre del procedimiento 
  
-<code sql> 
-CALL ver_pistas(); 
-</code> 
  
 {{ youtube>XQfPcx7YI0A }} {{ youtube>XQfPcx7YI0A }}
Línea 282: Línea 326:
  
 Si en un momento dado se quiere consultar el estado de la opción ''AUTOCOMMIT'' se puede realizar con la instrucción ''SHOW VARIABLES'' Si en un momento dado se quiere consultar el estado de la opción ''AUTOCOMMIT'' se puede realizar con la instrucción ''SHOW VARIABLES''
-===== Control de Excepciones ====+==== Control de Excepciones ====
- +
  
 Como ocurre con muchos lenguajes de programación, //MySQL// también es capaz de gestionar, mediante excepciones, los errores que se puedan producir durante la ejecución de un fragmento de código en entornos transaccionales. En estos, si durante la ejecución de una transacción, se produce    algún fallo, es posible deshacer toda la operación para evitar inconsistencias en los datos. Como ocurre con muchos lenguajes de programación, //MySQL// también es capaz de gestionar, mediante excepciones, los errores que se puedan producir durante la ejecución de un fragmento de código en entornos transaccionales. En estos, si durante la ejecución de una transacción, se produce    algún fallo, es posible deshacer toda la operación para evitar inconsistencias en los datos.
Línea 293: Línea 335:
 CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), p_tipo VARCHAR(255),  CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), p_tipo VARCHAR(255), 
     p_precio FLOAT, p_id_polideportivo INT)     p_precio FLOAT, p_id_polideportivo INT)
-procedimiento: BEGIN +BEGIN 
-    DECLARE existe_polideportivo TINYINT(1);+    -- Primero se declaran las variables necesarias 
 + 
 +    -- Después se declara el Handler
     DECLARE EXIT HANDLER FOR SQLEXCEPTION     DECLARE EXIT HANDLER FOR SQLEXCEPTION
     BEGIN     BEGIN
         ROLLBACK;         ROLLBACK;
 +        -- Si se quiere mostrar un mensaje: (opcional)
         SELECT 'An error has occurred, operation rollbacked';         SELECT 'An error has occurred, operation rollbacked';
     END;     END;
  
-    SET existe_polideportivo = (SELECT COUNT(*) FROM polideportivos 
-                                WHERE id = p_id_polideportivo); 
-    IF existe_polideportivo = 0 THEN 
-        LEAVE procedimiento; 
-    END IF; 
  
     START TRANSACTION;     START TRANSACTION;
Línea 315: Línea 355:
  
     COMMIT;     COMMIT;
-END procedimiento;+END;
 </code> </code>
  
bloque3/programacion.1637001227.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)