1+ /*
2+ * Asignatura: BASES DE DATOS B.
3+ *
4+ * UF04-PAC03
5+ *
6+ * ORACLE DB
7+ *
8+ * Realizado por: Unai de la O Pagaegui
9+ */
10+
11+ -- Antes de nada, se activa el modo serveroutput y mensaje inicial.
12+ SET SERVEROUTPUT ON
13+ EXECUTE DBMS_OUTPUT .PUT_LINE (' EJERCICIOS UF4-PAC3' );
14+ EXECUTE DBMS_OUTPUT .PUT_LINE (' Unai de la O Pagaegui' );
15+
16+ /* =============== EJERCICIO 1 =============== */
17+
18+ /*
19+ * Crea un tipo DIRECCIÓN con los siguientes atributos:
20+ * - calle
21+ * - ciudad
22+ * - país
23+ * - código postal
24+ */
25+ CREATE OR REPLACE TYPE direccion_t AS OBJECT (
26+ calle VARCHAR2 (30 ),
27+ ciudad VARCHAR2 (30 ),
28+ pais VARCHAR2 (30 ),
29+ cp NUMBER (5 )
30+ );
31+ /
32+
33+ /*
34+ * Crea un tipo EMPLEADO con los siguientes atributos
35+ * - número de empleado
36+ * - nombre
37+ * - apellido
38+ * - email
39+ * - teléfono
40+ * - fecha de alta
41+ * - sueldo anual
42+ * - nombre del departamento
43+ * - dirección (de tipo DIRECCIÓN definido antes)
44+ *
45+ * Y un método para mostrar la dirección en pantalla (IMPORTANTE: este método
46+ * debe estar dentro del BODY del tipo empleado).
47+ */
48+ -- Parte declarativa o cabecera.
49+ CREATE OR REPLACE TYPE empleado_t AS OBJECT (
50+ num_empleado NUMBER ,
51+ nombre VARCHAR2 (20 ),
52+ apellido VARCHAR2 (20 ),
53+ email VARCHAR2 (30 ),
54+ telefono NUMBER (9 ),
55+ fecha_alta DATE ,
56+ sueldo_anual NUMBER ,
57+ nombre_dpto VARCHAR2 (20 ),
58+ direccion direccion_t,
59+ MEMBER PROCEDURE imprime_direccion
60+ );
61+ /
62+
63+ -- Parte del cuerpo.
64+ CREATE OR REPLACE TYPE BODY empleado_t AS
65+ MEMBER PROCEDURE imprime_direccion IS
66+ BEGIN
67+ DBMS_OUTPUT .PUT_LINE (' Direccion del empleado ' || num_empleado ||
68+ ' es: ' || direccion .calle || ' , ' ||
69+ direccion .ciudad || ' , ' || direccion .pais ||
70+ ' , ' || direccion .cp );
71+ END imprime_direccion;
72+ END;
73+ /
74+
75+ /* ***** PRUEBA ******/
76+ DECLARE
77+ dir_a direccion_t := direccion_t(' calle Alemania 24' , ' Madrid' , ' España' , 28810 );
78+ emp_1 empleado_t :
= empleado_t (
1 ,
' Juan' ,
' Torres' ,
' [email protected] ' ,
915456389 ,
79+ ' 21-03-2017' , 25000 , ' Deportes' , dir_a);
80+ BEGIN
81+ DBMS_OUTPUT .PUT_LINE (' ~~~ Probando los tipos objeto creados ~~~' );
82+ emp_1 .imprime_direccion ();
83+ DBMS_OUTPUT .PUT_LINE (' Y por ejemplo, su email es ' || emp_1 .email ||
84+ ' , con fecha de alta ' || emp_1 .fecha_alta || CHR(10 ));
85+ END;
86+ /
87+
88+
89+ /*
90+ * Crea una tabla de empleados cuyos registros son objetos de tipo EMPLEADO y
91+ * dale una clave primaria al atributo 'número de empleado' en esa tabla.
92+ */
93+ CREATE TABLE empleados OF empleado_t(
94+ CONSTRAINT empleados_pk PRIMARY KEY (num_empleado)
95+ );
96+ /
97+
98+ /*
99+ * Inserta tres empleados en la tabla de los empleados con los números
100+ * de empleado 310, 370 y 390.
101+ */
102+ DECLARE
103+ -- direcciones
104+ dir_e1 direccion_t := direccion_t(' calle Sol 12' , ' Madrid' , ' España' , 28010 );
105+ dir_e2 direccion_t := direccion_t(' calle Barco 4' , ' Madrid' , ' España' , 28020 );
106+ dir_e3 direccion_t := direccion_t(' calle San Marcos 56' , ' Madrid' , ' España' , 28030 );
107+ -- empleados
108+ e1 empleado_t :
= empleado_t (
310 ,
' Sara' ,
' Olmedo' ,
' [email protected] ' ,
917207070 ,
109+ ' 11-08-2016' , 27000 , ' Contabilidad' , dir_e1);
110+ e2 empleado_t :
= empleado_t (
370 ,
' Paco' ,
' Castillo' ,
' [email protected] ' ,
912301234 ,
111+ ' 15-11-2017' , 24000 , ' Almacen' , dir_e2);
112+ e3 empleado_t :
= empleado_t (
390 ,
' Alba' ,
' Solana' ,
' [email protected] ' ,
913335566 ,
113+ ' 27-10-2010' , 35000 , ' Ventas' , dir_e3);
114+ BEGIN
115+ INSERT INTO empleados VALUES (e1);
116+ INSERT INTO empleados VALUES (e2);
117+ INSERT INTO empleados VALUES (e3);
118+ END;
119+ /
120+
121+ /*
122+ * Modifica el sueldo del empleado no. 310, el teléfono del
123+ * empleado no. 370 y la calle del empleado no. 390.
124+ */
125+ -- modifica sueldo del empleado 310 de 27000 a 77500.
126+ UPDATE empleados SET sueldo_anual = 77500 WHERE num_empleado = 310 ;
127+ -- modifica el teléfono del empleado 370 a 666000222.
128+ UPDATE empleados SET telefono = 666000222 WHERE num_empleado = 370 ;
129+ -- modifica la calle del empleado 390.
130+ UPDATE empleados t SET t .direccion .calle = ' calle Nueva 1' WHERE t .num_empleado = 390 ;
131+
132+
133+ /* SELECT personalizado para comprobar las modificaciones */
134+ SELECT t .num_empleado , t .telefono , t .sueldo_anual , t .direccion .calle
135+ FROM empleados t
136+
137+ /*
138+ * Elimina al empleado número 310 de la tabla.
139+ */
140+ DELETE FROM empleados WHERE num_empleado = 310 ;
141+
142+
143+ /* =============== EJERCICIO 2 =============== */
144+
145+ /*
146+ * Crea una referencia REF al tipo EMPLEADO y apunta con tal
147+ * referencia al empleado 370 de la anterior tabla de empleados.
148+ */
149+ DECLARE
150+ -- variable de tipo objeto empleado_t, null.
151+ empleado1 empleado_t;
152+ -- variable de tipo puntero que referencia a tipo objeto empleado_t.
153+ empleado370_puntero REF empleado_t;
154+ -- variable que contendrá el nombre y apellidos de un empleado.
155+ nombre_completo VARCHAR2 (100 );
156+ BEGIN
157+ -- recoge el valor del puntero y lo aloja en empleado_puntero
158+ SELECT REF(t) INTO empleado370_puntero
159+ FROM empleados t WHERE t .NUM_EMPLEADO = 370 ;
160+ -- dereferencia el puntero, asignando el valor del registro en empleado1, usando tabla DUAL.
161+ SELECT DEREF(empleado370_puntero) INTO empleado1 FROM DUAL;
162+ -- asignación del valor a nombre_completo.
163+ nombre_completo := ' Nombre: ' || empleado1 .nombre || ' , ' ||
164+ ' Apellido: ' || empleado1 .apellido ;
165+ -- se muestra por pantalla nombre_apellido
166+ DBMS_OUTPUT .PUT_LINE (nombre_completo);
167+ END;
168+ /
169+
170+ /*
171+ -- Instrucciones complementarias.
172+ DROP TYPE direccion_t FORCE;
173+ DROP TYPE empleado_t FORCE;
174+ DROP TABLE empleados;
175+
176+ SELECT * FROM empleados
177+ */
0 commit comments