Ejercicios propuestos y resueltos Concesionario PL SQL
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 jardinería 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.
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:
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.
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.