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;

lunes, 13 de abril de 2015

Solución repaso entera del año pasado

EJERCICIO 1
1) A los trabajadores que han estado asignados a edificios de oficinas, disminuirles su TARIFA EN 2 euros.

update trabajador
set tarifa=tarifa-2
 where id_t in (select   t.id_t
from trabajador t, asignacion a, edificio e
where e.ID_E=a.ID_E and
      t.ID_T=a.ID_T and
     UPPER(e.TIPO)='OFICINA')


2)  A cada supervisor que supervisa a más de un trabajador, actualizar su TARIFA   la mayor TARIFA de los que dependen de él..

UPDATE TRABAJADOR T0
SET T0.TARIFA = (SELECT MAX(TARIFA) FROM TRABAJADOR WHERE TRABAJADOR.ID_SUPV=T0.ID_T)
WHERE ID_T IN
( SELECT S.ID_T
 FROM TRABAJADOR T, TRABAJADOR  S
 WHERE T.ID_SUPV=S.ID_T
 GROUP BY S.ID_T
 having  count(t.ID_T) > 1)
       
3) Incrementar un 5% la tarifa de todos los trabajadores que tienen una tarifa por hora menor que la del promedio de todos los trabajadores que dependen del mismo supervisor que él.


UPDATE TRABAJADOR
SET TRABAJADOR.TARIFA=TRABAJADOR.TARIFA*1.05
WHERE TRABAJADOR.TARIFA < ( SELECT AVG(T2.TARIFA) FROM TRABAJADOR T2
                                       WHERE TRABAJADOR.ID_SUPV=T2.ID_SUPV)


4) Insertar un nuevo trabajador , su ID_T será 4000, su nombre será G.ALVAREZ,
   su supervisor  nadie, el oficio será el mismo de los supervisados por C.COULOMB y su tarifa la media de las tarifas de los empleados supervisados por C. COULOMB.

---una forma, usando subconsulta en la cláusula FROM

INSERT INTO TRABAJADOR
SELECT  DISTINCT 4000,'G_ALVAREZ',
 ( SELECT AVG(TARIFA) FROM TRABAJADOR
 WHERE ID_SUPV=
         (SELECT ID_T FROM TRABAJADOR WHERE
         NOMBRE LIKE '%COULOMB%') ),
 OFICIO,NULL FROM TRABAJADOR
 WHERE ID_SUPV =
 (SELECT ID_T FROM TRABAJADOR WHERE
 NOMBRE LIKE '%COULOMB%')


-----otra forma (Con GROUB BY)
INSERT INTO TRABAJADOR(ID_T,NOMBRE, TARIFA,OFICIO)
(SELECT 4000,'F.ALVAREZ',AVG(TARIFA),OFICIO FROM TRABAJADOR WHERE
ID_T IN
(SELECT ID_T FROM TRABAJADOR WHERE ID_SUPV =
(SELECT ID_T FROM TRABAJADOR WHERE NOMBRE = 'C.COULOMB')
)
GROUP BY OFICIO);

5) a) Crea una vista  que contenga los nombres de los electricistas, la dirección de los edificios a los que están asignados y cuántas veces han estado asignados a esos edificios.


CREATE OR REPLACE VIEW (TRABAJADOR,DIRECCION,NUM_DESTINOS) AS
SELECT T.NOMBRE,E.DIR,COUNT(A.ID_T)
FROM TRABAJADOR T, EDIFICIO E, ASIGNACION A
WHERE T.ID_T=A.ID_T AND E.ID_E=A.ID_E AND UPPER(T.OFICIO) LIKE 'ELECTRI%'
GROUP BY T.NOMBRE,E.DIR

b)Crea una secuencia de nombre SEQ_EXAMEN, con valor inicial 4500 y valor final 4600 e incremento de 1 en 1. Usa esa secuencia para la columna ID_T de la tabla TRABAJADOR y añade una fila en dicha tabla con los valores que quieras en las demás columnas.

c) Usa dicha secuencia para añadir una fila en la vista VISTA4 comentando lo que ocurre y por qué

 6) Se quiere borrar toda la información que se tiene del trabajador P.MASON. Indica las instrucciones que debes ejecutar para ello.

DELETE ASIGNACION WHERE ASIGNACION.ID_T =
(SELECT TRABAJADOR.ID_T FROM TRABAJADOR WHERE
 TRABAJADOR.NOMBRE ='P.MASON');

UPDATE TRABAJADOR
SET TRABAJADOR.ID_SUPV=NULL
WHERE ID_SUPV =
(SELECT TRABAJADOR.ID_T FROM TRABAJADOR WHERE
 TRABAJADOR.NOMBRE ='P.MASON');

DELETE  TRABAJADOR WHERE
 TRABAJADOR.NOMBRE ='P.MASON';



7) a) A  partir de tu situación actual, conectado como EJER1, enumera los pasos necesarios para que el usuario usuarioxx  pueda realizar las operaciones siguientes:
- Pueda ver los datos a través de la vista creada en el ejercicio 5 a)  y además pueda otorgar este derecho.
- Pueda actualizar las columnas TARIFA de TRABAJADOR y la columna NUM_DIAS de ASIGNACION.
- Pueda insertar filas nuevas en las tabla ASIGNACION.

SQL> GRANT SELECT ON  TO USUARIO00 WITH GRANT OPTION;

Concesión terminada correctamente.

SQL> GRANT UPDATE(TARIFA) ON TRABAJADOR TO USUARIO00;

Concesión terminada correctamente.

SQL> GRANT UPDATE(NUM_DIAS) ON ASIGNACION TO USUARIO00;

Concesión terminada correctamente.

SQL> GRANT INSERT ON ASIGNACION TO USUARIO00;

Concesión terminada correctamente.
b)      Entra como USUARIOXX y comprueba los privilegios adquiridos.

SQL> CONN USUARIO00/USUARIO00;
Conectado.
SQL> SELECT * FROM EJER1.VISTA5;

TRABAJADOR           DIRECCION       NUM_DESTINOS
-------------------- --------------- ------------
C.COULOMB            456 MAPLE                  1
C.COULOMB            1415 BEACH                 1
M.FARADAY            123 ELM                    2
M.FARADAY            789 OAK                    1


SQL> UPDATE EJER1.TRABAJADOR
  2  SET TARIFA=TARIFA+1;

6 filas actualizadas.

SQL> UPDATE EJER1.ASIGNACION
  2  SET NUM_DIAS=NUM_DIAS+1;

19 filas actualizadas.


SQL> ED
Escrito archivo afiedt.buf

  1  INSERT INTO EJER1.ASIGNACION
  2* VALUES (1235,312,SYSDATE,3)
SQL> /

1 fila creada.

EJERCICIO 2
1)
a)      Modifica la tabla profesores añadiéndole una columna NUM_CURSOS NUMBER(3).
b)      Esta columna está destinada a guardar el nº de cursos impartido por cada profesor.  Escribe la sentencia
UPDATE que lleve a cabo esta misión.
rem a)
alter table profesores
add (num_cursos number(3));
rem b)
update profesores
            set num_cursos=(select count(cursos.dni_profesor)  from cursos
      where dni_profesor=profesores.dni);


2) Hay que dar de alta una fila en la tabla TIPOS_CURSO, el COD_CURSO es SGBDR012, el  título Oracle Forms 10g   y la duración de 10 horas menos que la máxima duración de los cursos que no sean ni electricidad ni soldadura.
insert into tipos_curso
select 'SGBDR012','Oracle Forms 10g',max(duracion-10) from tipos_curso
where upper(titulo) NOT IN ('SOLDADURA','ELECTRICIDAD')

3) Se ha asignado al profesor de apellido “Algete” que imparta el curso 534 , de “Introducción a Oracle”. Haz el correspondiente UPDATE  en la tabla CURSOS.
update cursos set
 cod_curso =(select cod_curso  from tipos_curso
                      where upper(titulo) like '%ORACLE%'),
                   DNI_PROFESOR=(select dni from profesores
                         where upper(apellido1)='ALGETE')
WHERE N_CURSO=534;


4) Tras repasar los datos nos hemos dado cuenta que se cometió un error al introducir el DNI del alumno Pedro García García, se tecleo 43734348 cuando en realidad su DNI  es 43734384. Escribe las instrucciones que creas necesarias para arreglar dicho error en las tablas ALUMNOS y ASISTIR.


-- METO LA FILA EN ALUMNOS

INSERT INTO ALUMNOS  SELECT 43734384,ALUMNOS.NOMBRE,ALUMNOS.APELLIDO1,ALUMNOS.APELLIDO2,  ALUMNOS.DIRECCION,  ALUMNOS.TELEFONO,ALUMNOS.EDAD,ALUMNOS.CIF
FROM ALUMNOS WHERE DNI=43734348

-- METO LAS FILAS EN ASISTIR

insert into asistir select 43734384, asistir.N_CURSO, asistir.NOTA from asistir WHERE dni=43734348

 -- borro en asistir

delete from asistir WHERE dni=43734348

--borro en alumnos

delete from alumnos WHERE dni=43734348


5) Crea la vista ASISTENCIA_CURSOS  que tendrá todas las columnas de la tabla ASISTIR, todas las de la tabla TIPOS_CURSO, y las columnas FECHA_INICIO, FECHA_FIN y   DNI_PROFESOR. de la tabla CURSOS. Joins por columnas comunes.

CREATE OR REPLACE VIEW ASISTENCIA_CURSOS
(DNI, N_CURSO, NOTA, COD_CURSO, TITULO,
 DURACION, FECHA_INICIO, FECHA_FIN, DNI_PROFESOR)
AS
select asistir.*,tipos_curso.*,cursos.fecha_inicio,cursos.fecha_fin,cursos.dni_profesor
from asistir,cursos,tipos_curso
where asistir.n_curso=cursos.n_curso and
cursos.cod_curso=tipos_curso.cod_curso;



Intenta hacer un UPDATE en ASISTENCIA-CURSOS  actualizando N_CURSO  a 522  en aquellas filas en las que N_CURSO es igual a  521. Comenta lo que ocurre y por qué.


6) Crea una secuencia denominada SEQ_EXAMEN  que comienza por 600, incrementando de 1 en 1, y con valor máximo 700. Utiliza esa secuencia con la columna  N_CURSOS de la tabla CURSOS para insertar 2 filas con los valores que quieras para las demás columnas.

CREATE SEQUENCE SEQ_EXAMEN
START WITH 10020
MAXVALUE 11000
INCREMENT BY 1
NOCYCLE
NOCACHE;

INSERT INTO ESTUDIANTES VALUES (SEQ_EXAMEN.NEXTVAL,'PEPE','GÓMEZ','Historia',0);
INSERT INTO ESTUDIANTES VALUES (SEQ_EXAMEN.NEXTVAL,'ana','pérez','Económicas',0);

EJERCICIO 3

1)      Eliminar los módulos que no tengan estudiantes registrados.

 delete from modulos
where (departamento,curso) NOT IN
(SELECT departamento,curso FROM estudiantes_registrados)




2)      Actualizar la columna NUM_ESTUDIANTES de la tabla MÓDULOS. Para ello debe usarse la tabla ESTUDIANTES_REGISTRADOS  donde tenemos la información de los módulos en los que está matriculado cada estudiante.

update modulos
set NUM_ESTUDIANTES=
(SELECT COUNT(*) FROM ESTUDIANTES_REGISTRADOS R
WHERE MODULOS.CURSO=R.CURSO AND MODULOS.DEPARTAMENTO=R.DEPARTAMENTO)

3)Actualizar la columna CREDITOS_ACTUALES de la tabla ESTUDIANTES. Para ello deben usarse la tabla ESTUDIANTES_REGISTRADOS  donde tenemos la información de los módulos en los que está matriculado cada estudiante y la tabla MODULOS donde tenemos cuantos créditos le corresponden a cada módulo.

UPDATE estudiantes
SET creditos_actuales=
(SELECT SUM(M.num_creditos) FROM modulos M,estudiantes_registrados E
WHERE M.departamento=E.departamento AND M.curso=E.curso
GROUP BY e.estudiante_id
HAVING estudiantes.id=e.estudiante_id)

      

Softros LAN Messenger

Instalacion:
1- Ejecutar el .exe
2- copiar el contenido de la medicina en la carpeta de instalacion (C>Archivos de programas>softros....)

Para que no salten las ventanas de los mensajes nos vamos a "configuracion->mensajes->minimizar mensajes entrantes a la barra".



Descargar 
Contraseña: jamespoetrodriguez