martes, 19 de mayo de 2015

Solución catastro

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;