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:39] – [Procedimientos y funciones almacenadas] fernandobloque3:programacion [2024/09/16 15:37] (actual) – editor externo 127.0.0.1
Línea 185: Línea 185:
 </code> </code>
  
-==== Etiquetas en procedimientos ====+==== 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. 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.
Línea 204: Línea 204:
                                 WHERE id = p_id_polideportivo);                                 WHERE id = p_id_polideportivo);
     IF existe_polideportivo = 0 THEN     IF existe_polideportivo = 0 THEN
-        LEAVE procedimiento;+        LEAVE procedimiento; -- indico el bloque del que quiero salir
     END IF;     END IF;
  
Línea 213: Línea 213:
  
 END procedimiento; 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>
Línea 232: 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 241: 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 249: 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. +  * 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.+  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 268: 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 316: 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 338: Línea 355:
  
     COMMIT;     COMMIT;
-END procedimiento;+END;
 </code> </code>
  
bloque3/programacion.1637001540.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)