bloque3:programacion
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| bloque3:programacion [2021/11/15 18:39] – [Procedimientos y funciones almacenadas] fernando | bloque3:programacion [2024/09/16 15:37] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 185: | Línea 185: | ||
| </ | </ | ||
| - | ==== Etiquetas | + | ==== Salir de un procedimiento: |
| Si deseo terminar un procedimiento en un momento dado, puedo usar la sentencia '' | Si deseo terminar un procedimiento en un momento dado, puedo usar la sentencia '' | ||
| 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; |
| END IF; | END IF; | ||
| Línea 213: | Línea 213: | ||
| END procedimiento; | END procedimiento; | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Función LAST_INSERT_ID() ==== | ||
| + | Cuando queremos ejecutar varias operaciones que modifican la base de datos es recomendable agruparlas en una // | ||
| + | |||
| + | La función '' | ||
| + | |||
| + | <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(), | ||
| </ | </ | ||
| 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(' | CALL cantidad_pedidos_por_estado(' | ||
| 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, | + | * 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, |
| - | 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. | + | |
| ==== Desventajas ==== | ==== Desventajas ==== | ||
| - | Como principal desventaja se podría destacar la simplicidad del código que se puede utilizar en su implementación, | + | * Como principal desventaja se podría destacar la simplicidad del código que se puede utilizar en su implementación, |
| - | + | ||
| - | + | ||
| - | 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 ';' | + | A la hora de implementar nuevos procedimientos y funciones hay que tener en cuenta algunas cuestiones. Puesto que el delimitador |
| Así, la forma habitual de escribir procedimientos o funciones es a través de la creación de scripts //SQL// utilizando la orden '' | Así, la forma habitual de escribir procedimientos o funciones es a través de la creación de scripts //SQL// utilizando la orden '' | ||
| 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 ; | ||
| </ | </ | ||
| - | 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 '' | ||
| - | <code sql> | ||
| - | CALL ver_pistas(); | ||
| - | </ | ||
| {{ youtube> | {{ youtube> | ||
| Línea 316: | Línea 335: | ||
| CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), | CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), | ||
| p_precio FLOAT, p_id_polideportivo INT) | p_precio FLOAT, p_id_polideportivo INT) | ||
| - | procedimiento: | + | BEGIN |
| - | | + | |
| + | |||
| + | -- 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; |
| </ | </ | ||
bloque3/programacion.1637001540.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)