BD TAREA 05
PILAR ALONSO SUELA 1º DAMEL
Para realizar los ejercicios se utilizarán las tablas creadas para la tarea 4.
Apartado A.
Desde la herramienta gráfica Application Express que ofrece Oracle
Database realiza estas operaciones.
Debes hacer una captura de pantalla justo antes de pulsar el botón de
Aceptar para incorporarla al documento de la tarea como
respuesta a estos ejercicios:
1. Inserta un registro nuevo en la tabla PRODUCTOS.
2. Rebaja el precio del producto más caro en 10€.
He creado un nuevo usuario con un workspace
PILAR2
PRODUCTOS
PASSWORD:PILAR
Entramos en aplication express
pág. 1
Explorador de objetos
Iremos a la tabla Productos para añadir un registro nuevo
Iremos a la pestaña Data para insertar la fila
pág. 2
Insert Row
pág. 3
Como solo queremos añadir una fila hacemos click en créate, si
quisiéramos añadir alguna más seleccionaríamos create and create
another
Y aquí vemos la inserción realizada a través de la interfaz gráfica.
REBAJA EL PRECIO DEL PRODUCTO MÁS CARO 10 EUROS.
Para hacerlo desde la interfaz grafica iremos a la pestaña de data:
pág. 4
Y seleccionamos query
Seleccionamos todos los datos y ordenamos por precio ascendente y
hacemos click en query.
pág. 5
He añadido otro producto más para que pueda verse la consulta.
Y sale la primera la más cara
Apartado B.
Utilizando sentencias SQL, desde la pantalla de Comandos SQL,
escribe la sentencia a ejecutar para realizar la operación que se
pide en cada ejercicio y contesta a las preguntas si es el caso. En
la entrega de la tarea debes copiar las sentencias que has utilizado
como respuesta a cada ejercicio.
pág. 6
Vamos a sql commands
- Desmarca la casilla de la pantalla de Comandos
SQL: Confirmación automática/autocommit
(cuando está marcada hace un commit después de ejecutar cada
sentencia)
pág. 7
- Si cierras el gestor de bases de datos se elimina el progreso. Para
guardarlo, hace falta hacer un commit. SENTENCIA: commit;
3. Inserta un nuevo cliente:
CODIGO NOMBRE APELLIDOS EDAD
0008 Maria Pilar Quiles Carrera 25
INSERT INTO CLIENTES (codigo,nombre,apellidos,edad)
VALUES(008,'Maria Pilar','Quiles Carrera',25);
COMMIT;
pág. 8
4. Inserta un pedido del cliente anterior con los valores que se
indican
NUM FECHA GASTOS_ENVIO_ FECHA_PREVISTA IMPORTE CLIENTE
El
siguiente al
20 días después de la
último De hoy Sin valor
fecha del pedido
Sin valor 0008
Ejemplo:
11
INSERT INTO PEDIDOS(num,fecha,fecha_prevista,cliente)
VALUES(11,SYSDATE,SYSDATE+20,0008);
COMMIT;
5. Inserta la primera línea para el pedido anterior
NUM NUM_PEDIDO PRODUCTO CANTIDAD IMPORTE
1 último 10001 3 El que corresponda
INSERT INTO LINEAS(num,num_pedido,producto,cantidad,importe)
VALUES(1,11,10001,3,100);
COMMIT;
pág. 9
6. Inserta la segunda línea al pedido anterior:
NUM NUM_PEDIDO PRODUCTO CANTIDAD IMPORTE
2 ultimo 10002 2 El que corresponda
INSERT INTO LINEAS(num,num_pedido,producto,cantidad,importe)
VALUES(2,11,10002,2,150);
COMMIT;
pág. 10
7. Modifica el pedido 11 para que el importe total tenga el valor que
corresponda.
UPDATE PEDIDOS SET TOTAL=(select sum(l.importe) from LINEAS l where
l.num_pedido=11)WHERE cliente=0008;
COMMIT;
8. Haz un SELECT que muestre las líneas del pedido 11. Copia
también aquí el resultado. Y confirma definitivamente (COMMIT)
los cambios realizados hasta ahora en las tablas.
pág. 11
9. Ha habido un problema con el reparto en febrero, por lo que hay
que retrasar las fechas previstas de entrega de febrero para 30
días después
UPDATE PEDIDOS SET FECHA_PREVISTA=(fecha_prevista+30);
COMMIT;
pág. 12
10. A todos los pedidos sin gastos de envío hay que ponerles valor 0
en ese atributo.
UPDATE PEDIDOS SET GASTOS_ENVIO=0 WHERE
GASTOS_ENVIO=NULL;
No he realizado el commit para poder hacer el ejercicio 12
11. Hay que subir el precio de todos los productos en un 10%
UPDATE PRODUCTOS SET PRECIO=((PRECIO*10)/100);
pág. 13
12. A nivel teórico. ¿Qué cambios se desharían si ahora ejecutamos
ROLLBACK?.
Con un commit estamos confirmando la realización de la transacción
realizada, mientras que con un rollback estamos cancelando la
transacción y volviendo al estado anterior.
Por tanto si hiciéramos un rollback en este momento nos llevaría al punto
donde hicimos el último commit, es decir, el último punto donde
confirmamos la realización de la transacción realizada.
En mi caso la última vez que hice commit fue en el punto 10.
13. Borra los productos que no hayan sido pedidos nunca. ¿Cuántos
se han borrado?
DELETE
FROM PRODUCTOS P
WHERE P.CODIGO IN
(SELECT P.CODIGO FROM PRODUCTOS P
LEFT JOIN LINEAS L ON L.PRODUCTO = P.CODIGO
WHERE L.PRODUCTO IS NULL);
pág. 14
Ha borrado 5 líneas, ya que yo he añadido productos.
14. Borra el producto 10001. ¿Qué ocurre y por qué?
ORA-02292: integrity constraint (PILAR2.PRODUCTO_FK) violated - child record
found
Estamos violando la restricción de integridad de la tabla al intentar eliminar un
registro principal que está en otra tabla secundaria.
Lo vemos más claramente viendo la sentencia de creación de la tabla
LINEAS :
CREATE TABLE LINEAS (
NUM NUMBER(2,0),
pág. 15
NUM_PEDIDO NUMBER(5,0),
PRODUCTO NUMBER(5,0) NOT NULL ,
CANTIDAD NUMBER(8,0) NOT NULL ,
IMPORTE NUMBER(6,2),
CONSTRAINT DETALLE_PK PRIMARY KEY (NUM, NUM_PEDIDO) ,
CONSTRAINT PEDIDO_FK FOREIGN KEY (NUM_PEDIDO)
REFERENCES PEDIDOS (NUM) ,
CONSTRAINT PRODUCTO_FK FOREIGN KEY (PRODUCTO)
REFERENCES PRODUCTOS (CODIGO)
); Al encontrarse el producto en la tabla LINEAS , ya que ha sido pedido no
podemos borrar el registro sin primero borrarlo de la tabla hija y después
de la tabla padre.
15. Qué sentencias habría que ejecutar y en qué orden hasta poder
eliminar de la tabla el producto 10001
Primero debemos borrar el registro de la tabla hija LINEAS:
DELETE FROM LINEAS L WHERE L.PRODUCTO=10001;
Y Ahora se debe borrar de la tabla padrePRODUCTOS:
DELETE FROM PRODUCTOS P WHERE P.CODIGO=10001;
pág. 16
pág. 17