Skip to content

Commit 854f6d1

Browse files
committed
Add uf4-pac3.sql
1 parent 56a2ee3 commit 854f6d1

1 file changed

Lines changed: 177 additions & 0 deletions

File tree

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
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

Comments
 (0)