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:41] – [Ventajas] 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 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 260: Línea 284:
 ==== 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 266: 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 314: 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 336: Línea 355:
  
     COMMIT;     COMMIT;
-END procedimiento;+END;
 </code> </code>
  
bloque3/programacion.1637001662.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)