Hola a todos, hoy os dejo una serie de ejercicios sobre la base de datos oracle.
Todos los ejercicios que proponemos están resueltos en este mismo post, intenta hacerlo por ti mismo y si te quedas atascado puedes mirar la solución. Recuerda, que no tiene por que estar igual tu solución con la del post, el objetivo es que aprendas no que me copies la solución.
Aquí te dejo la base de datos de concesionario que debes importar.
Os dejo el modelo Entidad – Relación de la base de datos:

1. Crea una función a la que le pasaremos como parámetros de entrada: MATRICULA, NUEVO_PRECIO_COMPRA. la función modificara los datos del coche que tenga la matricula introducida actualizando el precio_compra de la siguiente forma:
-Si precio_compra es nulo hacer un update en el campo precio_compra asignándole el valor de nuevo_precio_compra
-Si no hacer un update en el campo precio_compra asignándole el valor de precio_compra+(precio_compra-nuevo_precio_compra).
La función devolverá el numero de filas actualizadas crea un bloque anónimo que ejecute la función anterior y muestre el resultado devuelto por la función.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
create or replace function actualizaPrecioCoche ( v_matricula COCHE.MATRICULA%type, v_nuevo_precio_compra COCHE.PRECIO_COMPRA%type) return number as v_precio_compra COCHE.PRECIO_COMPRA%type; begin select precio_compra into v_precio_compra from coche where matricula = v_matricula; if v_precio_compra is null then update coche set precio_compra = v_nuevo_precio_compra where matricula = v_matricula; else update coche set precio_compra = precio_compra+(precio_compra-v_nuevo_precio_compra) where matricula = v_matricula; end if; return SQL%ROWCOUNT; end; / select * from coche DECLARE v_matricula COCHE.MATRICULA%type := &matricula; v_nuevo_precio_compra COCHE.PRECIO_COMPRA%type := &nuevo_precio; v_total_filas number(8); BEGIN v_total_filas := actualizaPrecioCoche(v_matricula, v_nuevo_precio_compra); DBMS_OUTPUT.put_line('Se han modificado ' || v_total_filas || ' filas'); END; / |
2. Crea procedimiento que reciba como parámetros de entrada:P_ID_MARCA,P_NUMERO_COCHES. Utiliza un bucle para insertar N registros nuevos en la tabla COCHE. El numero de registros a insertar viene indicado por el parámetro P_NUMEROS_COCHES(CONTADOR) y el bucle empezará en 1, los datos a insertar serán:
-matricula=’A00’||CONTADOR
-DESCRIPCION=p_id_marca
-id_marca=p_id_marca
-precio_compra=nulo
Controlar excepción para cuando exista algún coche en la BBDD y se viole la pk.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
create or replace procedure creaCoches( p_id_marca coche.id_marca%type, p_numero_coches number) as begin for contador IN 1..p_numero_coches LOOP insert into coche values('A00'||contador, p_id_marca, p_id_marca, null); END LOOP; exception when dup_val_on_index then DBMS_OUTPUT.put_line('Registro duplicado'); end; / declare p_id_marca coche.id_marca%type := &id; p_numero_coches number(8) := # begin creaCoches(p_id_marca, p_numero_coches); end; / |
3.Crea un procedimiento al que le pasaremos el dni_cliente y la matricula. El procedimiento deberá controlar en las ventas de los coches(tabla vende) los siguientes supuestos:
-.Si no existe un registro con ese dni_cliente y esa matricula saltara a la zona de excepciones y mostrara un mensaje «no existe la venta introducida»
– Si existe la venta introducida:
I. mostrara el precio antiguo ||
II. actualizara el precio subiendo 1000 euros
III. devolverá en un parámetro de salida del procedimiento(ps_nuevo_precio) el precio nuevo tras la actualización crea un bloque anónimo que llame al procedimiento anterior y muestre el precio nuevo devuelto por el procedimiento.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
create or replace procedure actualizaVenta( p_dni_cliente vende.dni_cliente%type, p_matricula vende.matricula%type, ps_nuevo_precio out vende.precio%type ) as venta vende%rowtype; begin select * into venta from vende where dni_cliente = p_dni_cliente and matricula = p_matricula; DBMS_OUTPUT.PUT_line('el precio antiguo es ' || venta.precio); ps_nuevo_precio := venta.precio + 1000; update vende set precio = ps_nuevo_precio where dni_cliente = p_dni_cliente and matricula = p_matricula; EXCEPTION WHEN no_data_found then DBMS_OUTPUT.PUT_line('No existe la venta introducida'); end; / declare v_dni_cliente vende.dni_cliente%type := &dni; v_matricula vende.matricula%type := &matricula; v_nuevo_precio vende.precio%type; begin actualizaVenta(v_dni_cliente, v_matricula, v_nuevo_precio); if v_nuevo_precio is not null then DBMS_OUTPUT.PUT_line('el nuevo precio es ' || v_nuevo_precio); end if; end; / |
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Deja una respuesta