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:34] – [Control de Excepciones] fernando | bloque3: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), | CREATE PROCEDURE nueva_pista(p_codigo VARCHAR(10), | ||
p_precio FLOAT, p_id_polideportivo INT) | 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; | + | |
- | 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(), | VALUES (LAST_INSERT_ID(), | ||
- | END procedimiento; | + | END; |
</ | </ | ||
Línea 189: | Línea 183: | ||
END; | END; | ||
+ | </ | ||
+ | |||
+ | ==== Salir de un procedimiento: | ||
+ | |||
+ | Si deseo terminar un procedimiento en un momento dado, puedo usar la sentencia '' | ||
+ | <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_precio FLOAT, p_id_polideportivo INT) | ||
+ | | ||
+ | procedimiento: | ||
+ | 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) | ||
+ | VALUES (p_codigo, p_tipo, p_precio, p_id_polideportivo); | ||
+ | INSERT INTO pistas_abiertas (id_pista, operativa) | ||
+ | VALUES (LAST_INSERT_ID(), | ||
+ | |||
+ | 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(), | ||
+ | |||
</ | </ | ||
==== 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(' | CALL cantidad_pedidos_por_estado(' | ||
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, | + | * 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. | + | |
- | 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, | + | * 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 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 ; | ||
</ | </ | ||
- | 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 291: | 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 313: | Línea 355: | ||
COMMIT; | COMMIT; | ||
- | END procedimiento; | + | END; |
</ | </ | ||
bloque3/programacion.1637001291.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)