Os dejo el ejercicio de catastro resuelto a mi manera, puede que tenga algún error, si lo tiene avisadme.
--ejercicio 1
CREATE OR REPLACE
PROCEDURE INS_VIVIENDA
( p_calle IN VARCHAR2
, p_numero IN NUMBER
, p_tipo_vivienda IN VARCHAR2
, p_codigo_postal IN NUMBER
, p_metros IN NUMBER
, p_od_vivienda IN long
, p_nombrezona IN VARCHAR2
, p_dni IN number
) AS
v_zona_urbana zonaurbana.nombre_zona%type;--para comprobar la zona urbana
v_vivienda vivienda.calle%type;--para comprobar la vivienda
v_dni persona.dni%type;--para comprobar la persona
BEGIN
--compruebo que existe la zona urbana
begin
select nombre_zona into v_zona_urbana
from zonaurbana
where nombre_zona= p_nombrezona;
exception
when no_data_found then
v_zona_urbana:=null;
end;
--compruebo que no existe la vivienda
begin
select calle into v_vivienda from vivienda
where calle= p_calle
and numero= p_numero;
exception
when no_data_found then
v_vivienda:=null;
end;
-- compruebo si existe la persona
begin
select dni into v_dni
from persona
where dni= p_dni;
exception
when no_data_found then
v_dni:=null;
end;
if v_zona_urbana is null then--si no existe la zona urbana
dbms_output.put_line('No existe la zona urbana');
else
if v_vivienda is not null then--si existe la vivienda
dbms_output.put_line('Ya existe la vivienda');
else
if p_tipo_vivienda != 'C' and p_tipo_vivienda !='B' then--si no existe el tipo de vivienda
dbms_output.put_line('No existe el tipo de vivienda');
else
if v_dni is null then--si no existe el dni
dbms_output.put_line('No existe la persona');
else--si todo ok meto los datos
insert into vivienda values(p_calle, p_numero, p_tipo_vivienda, p_codigo_postal, p_metros, p_od_vivienda, p_nombrezona);
if p_tipo_vivienda='C' then --si es una casa o un bloque
insert into casaparticular values(p_calle, p_numero, p_metros, p_od_vivienda, p_dni);
else
insert into bloquecasas values(p_calle, p_numero, p_metros, p_od_vivienda);
end if;
end if;
end if;
end if;
end if;
END INS_VIVIENDA;
--prueba de que inserta
begin
ins_vivienda('Cruz Conden',20,'B',41702,80,null,'CENTRO',44351312);
end;
--ejercicio2 a)
CREATE OR REPLACE
FUNCTION POR_CALLENUM
( p_calle IN VARCHAR2
, p_numero IN NUMBER
) RETURN NUMBER AS
v_total NUMBER(3);
BEGIN
select count(*) into v_total
from persona
where calle= p_calle
and numero= p_numero;
RETURN v_total;
exception
when no_data_found then
dbms_output.put_line('No hay habitantes en esa calle/numero');
return (0);
END POR_CALLENUM;
--prueba
begin
dbms_output.put_line('Vecinos: '||por_callenum('Cruz Conde',20));
end;
--ejercicio2 b)
CREATE OR REPLACE
PROCEDURE DETALLES_CALLENUM
( p_calle IN VARCHAR2
, p_numero IN NUMBER
) AS
v_habitantes number(3);
v_tipo VARCHAR2(20);
v_nom_prop persona.nombre_persona%type;
v_ape_prop persona.apellidos_persona%type;
cursor habitantes_piso is
select * from piso
where calle= p_calle
and numero= p_numero;
v_datos_per habitantes_piso%rowtype;
BEGIN
v_habitantes:= por_callenum(p_calle, p_numero);
--relleno el tipo
select tipo_vivienda into v_tipo
from vivienda
where calle= p_calle
and numero=p_numero;
if v_tipo = 'C' then
select nombre_persona, apellidos_persona into v_nom_prop, v_ape_prop
from persona
where calle= p_calle
and numero= p_numero;
dbms_output.put_line('Personas que habitan en la calle '|| p_calle||' nº '|| p_numero||' : '|| v_habitantes||' (Unifamiliar)');
dbms_output.put_line('Propietario: '|| v_nom_prop||' '|| v_ape_prop);
else
dbms_output.put_line('Personas que habitan en la calle '|| p_calle||' nº '|| p_numero||' : '|| v_habitantes||' (Bloque casas)');
for v_datos_per in habitantes_piso loop
--busco propietario
select nombre_persona, apellidos_persona into v_nom_prop, v_ape_prop
from persona
where dni= v_datos_per.dni_p;
dbms_output.put_line('Escalera '||v_datos_per.escalera||' Planta '||v_datos_per.planta||' Puerta '||v_datos_per.puerta||' Propietario: '|| v_nom_prop||' '|| v_ape_prop);
end loop;
end if;
exception
when no_data_found then
dbms_output.put_line('Sin Datos');
END DETALLES_CALLENUM;
--prueba
begin
detalles_callenum('Cruz Conde',20);
end;