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:34] – [Control de Excepciones] 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 291: 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 313: Línea 355:
  
     COMMIT;     COMMIT;
-END procedimiento;+END;
 </code> </code>
  
bloque3/programacion.1637001291.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)