forked from AndresJMM/PLSQL
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPaquete.sql
More file actions
320 lines (273 loc) · 8.84 KB
/
Copy pathPaquete.sql
File metadata and controls
320 lines (273 loc) · 8.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
CREATE OR REPLACE PACKAGE PK1 IS
PROCEDURE xLis (xfamilia IN Articulos.cArtFml%TYPE);
END;
CREATE OR REPLACE PACKAGE BODY PK1 IS
/* PROCEDIMIENTO INSERTAR CENTRO */
PROCEDURE insertar_centro(
p_nombre in centros.nombre%type,
p_provincia in CENTROS.PROVINCIA%type
)
IS
v_nombre CENTROS.NOMBRE%type;
e_found exception;
BEGIN
select nombre
into v_nombre
from centros
where nombre=p_nombre;
if sql%found
then
raise e_found;
end if;
EXCEPTION
when e_found then
DBMS_OUTPUT.PUT_LINE('El centro que intenta insertar ya existe');
when no_data_found then
insert into centros (nombre, provincia) values (p_nombre, p_provincia);
END;
DECLARE
v_nombre CENTROS.NOMBRE%type:='centro1';
BEGIN
insertar_centro(v_nombre,'gipuzkoa');
DBMS_OUTPUT.PUT_LINE(v_nombre);
END;
/* PROCEDIMIENTO VISUALIZAR LISTA CENTRO */
PROCEDURE visualizar_lista_centro
IS
cursor c1 is
select *
from centros;
v_reg c1%rowtype;
BEGIN
open c1;
fetch c1 into v_reg;
while c1%found loop
DBMS_OUTPUT.PUT_LINE(v_reg.id || ' ' || v_reg.nombre || ' ' || v_reg.calle || ' ' || v_reg.numero || ' ' || v_reg.cp || ' ' || v_reg.ciudad || ' ' || v_reg.provincia || ' ' || v_reg.telefono);
fetch c1 into v_reg;
end loop;
close c1;
END visualizar_lista_centro;
execute visualizar_lista_centro;
select * from centros;
--BORRAR CENTRO Y TRANSFERIR LOS TRABAJADORES A OTRO CENTRO
PROCEDURE borrar_centro(
v_fuente IN CENTROS.ID%TYPE, v_destino IN CENTROS.ID%TYPE
)AS
E_FALLO_FUENTE EXCEPTION;
E_FALLO_DESTINO EXCEPTION;
E_FALLO_TRANSFERIR EXCEPTION;
V_TEMP CENTROS.ID%TYPE;
BEGIN
SELECT ID INTO V_TEMP FROM CENTROS WHERE ID = v_fuente;
IF SQL%NOTFOUND THEN
RAISE E_FALLO_FUENTE;
ELSE
SELECT ID into V_TEMP FROM CENTROS WHERE ID = v_destino;
IF SQL%NOTFOUND THEN
RAISE E_FALLO_DESTINO;
ELSE
UPDATE TRABAJADOR SET IDCENTRO=v_destino WHERE IDCENTRO = v_fuente;
IF SQL%NOTFOUND THEN
RAISE E_FALLO_TRANSFERIR;
END IF;
END IF;
END IF;
EXCEPTION
WHEN E_FALLO_FUENTE THEN
RAISE_APPLICATION_ERROR(-20111,'No se ha encontrado el centro a borrar.');
WHEN E_FALLO_DESTINO THEN
RAISE_APPLICATION_ERROR(-20111,'No se ha encontrado el centro de destino.');
when E_FALLO_TRANSFERIR THEN
RAISE_APPLICATION_ERROR(-20112,'Error al transferir los trabajadores.');
END;
desc centros;
--BUSCAR CENTRO POR NOMBRE
PROCEDURE buscar_centro_por_nombre(
v_nCentro IN CENTROS.NOMBRE%TYPE, v_idCentro OUT CENTROS.ID%TYPE
)AS
E_CENTRO_ERRONEO EXCEPTION;
BEGIN
SELECT ID INTO v_idCentro FROM CENTROS WHERE UPPER(NOMBRE) LIKE UPPER(V_NCENTRO);
IF SQL%NOTFOUND THEN
RAISE E_CENTRO_ERRONEO;
END IF;
EXCEPTION
WHEN E_CENTRO_ERRONEO THEN
RAISE_APPLICATION_ERROR(-20111,'No se ha encontrado el centro.');
END;
--CAMBIAR PROVINCIA
PROCEDURE cambiar_provincia(
p_idCentro NUMBER,
p_provincia VARCHAR2)
IS
e_idCentro_inexistente EXCEPTION;
-- BLOQUE PRINCIPAL
BEGIN
-- BLOQUE Para comprobar CENTRO repetido(Puede disparar NO_DATA_FOUND)
DECLARE
v_idCentro centro.idCentro%TYPE;
-- e_idCentro_inexistente se propaga;
BEGIN
SELECT idCentro INTO v_idCentro FROM centro
WHERE idCentro = p_idCentro);
-- Enviamos al bloque principal la excepción definida por nosotros e_idCentro_inexistente
IF SQL%NOTFOUND THEN
RAISE e_idCentro_inexistente;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--Si se dispara esta excepción hay error, ese p_idCentro no es correcto
RAISE_APPLICATION_ERROR ('-20002','Error: '||sqlerrm);
WHEN TOO_MANY_ROWS THEN
NULL;
END;
-- Fin del bloque de comprobación de id_Centro inexistente
-- Inserta Centro
UPDATE centro SET provincia = p_provincia WHERE centro.idCentro = p_idCentro
-- Comprobar
IF SQL%FOUND
THEN
COMMIT;
END IF;
EXCEPTION
WHEN e_idCentro_inexistente THEN
RAISE_APPLICATION_ERROR ('-20001','Err. id de Centro inexistente');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR ('-20003','Error: '||sqlerrm);
END cambiar_provincia;
END;
/* PROCEDIMIENTO INSERTAR CENTRO */
CREATE OR REPLACE PROCEDURE insertar_centro(
p_nombre in centros.nombre%type,
p_provincia in CENTROS.PROVINCIA%type
)
IS
v_nombre CENTROS.NOMBRE%type;
e_found exception;
BEGIN
select nombre
into v_nombre
from centros
where nombre=p_nombre;
if sql%found
then
raise e_found;
end if;
EXCEPTION
when e_found then
DBMS_OUTPUT.PUT_LINE('El centro que intenta insertar ya existe');
when no_data_found then
insert into centros (nombre, provincia) values (p_nombre, p_provincia);
END;
select * from centros;
execute insertar_centro('centro1','gipuzkoa');
DECLARE
v_nombre CENTROS.NOMBRE%type:='centro1';
BEGIN
insertar_centro(v_nombre,'gipuzkoa');
DBMS_OUTPUT.PUT_LINE(v_nombre);
END;
/* PROCEDIMIENTO VISUALIZAR LISTA CENTRO */
CREATE OR REPLACE PROCEDURE visualizar_lista_centro
IS
cursor c1 is
select *
from centros;
v_reg c1%rowtype;
BEGIN
open c1;
fetch c1 into v_reg;
while c1%found loop
DBMS_OUTPUT.PUT_LINE(v_reg.id || ' ' || v_reg.nombre || ' ' || v_reg.calle || ' ' || v_reg.numero || ' ' || v_reg.cp || ' ' || v_reg.ciudad || ' ' || v_reg.provincia || ' ' || v_reg.telefono);
fetch c1 into v_reg;
end loop;
close c1;
END visualizar_lista_centro;
execute visualizar_lista_centro;
select * from centros;
--BORRAR CENTRO Y TRANSFERIR LOS TRABAJADORES A OTRO CENTRO
CREATE OR REPLACE PROCEDURE borrar_centro(
v_fuente IN CENTROS.ID%TYPE, v_destino IN CENTROS.ID%TYPE
)AS
E_FALLO_FUENTE EXCEPTION;
E_FALLO_DESTINO EXCEPTION;
E_FALLO_TRANSFERIR EXCEPTION;
V_TEMP CENTROS.ID%TYPE;
BEGIN
SELECT ID INTO V_TEMP FROM CENTROS WHERE ID = v_fuente;
IF SQL%NOTFOUND THEN
RAISE E_FALLO_FUENTE;
ELSE
SELECT ID into V_TEMP FROM CENTROS WHERE ID = v_destino;
IF SQL%NOTFOUND THEN
RAISE E_FALLO_DESTINO;
ELSE
UPDATE TRABAJADOR SET IDCENTRO=v_destino WHERE IDCENTRO = v_fuente;
IF SQL%NOTFOUND THEN
RAISE E_FALLO_TRANSFERIR;
END IF;
END IF;
END IF;
EXCEPTION
WHEN E_FALLO_FUENTE THEN
RAISE_APPLICATION_ERROR(-20111,'No se ha encontrado el centro a borrar.');
WHEN E_FALLO_DESTINO THEN
RAISE_APPLICATION_ERROR(-20111,'No se ha encontrado el centro de destino.');
when E_FALLO_TRANSFERIR THEN
RAISE_APPLICATION_ERROR(-20112,'Error al transferir los trabajadores.');
END;
desc centros;
--BUSCAR CENTRO POR NOMBRE
CREATE OR REPLACE PROCEDURE buscar_centro_por_nombre(
v_nCentro IN CENTROS.NOMBRE%TYPE, v_idCentro OUT CENTROS.ID%TYPE
)AS
E_CENTRO_ERRONEO EXCEPTION;
BEGIN
SELECT ID INTO v_idCentro FROM CENTROS WHERE UPPER(NOMBRE) LIKE UPPER(V_NCENTRO);
IF SQL%NOTFOUND THEN
RAISE E_CENTRO_ERRONEO;
END IF;
EXCEPTION
WHEN E_CENTRO_ERRONEO THEN
RAISE_APPLICATION_ERROR(-20111,'No se ha encontrado el centro.');
END;
--CAMBIAR PROVINCIA
CREATE OR REPLACE PROCEDURE cambiar_provincia(
p_idCentro NUMBER,
p_provincia VARCHAR2)
IS
e_idCentro_inexistente EXCEPTION;
-- BLOQUE PRINCIPAL
BEGIN
-- BLOQUE Para comprobar CENTRO repetido(Puede disparar NO_DATA_FOUND)
DECLARE
v_idCentro centro.idCentro%TYPE;
-- e_idCentro_inexistente se propaga;
BEGIN
SELECT idCentro INTO v_idCentro FROM centro
WHERE idCentro = p_idCentro);
-- Enviamos al bloque principal la excepción definida por nosotros e_idCentro_inexistente
IF SQL%NOTFOUND THEN
RAISE e_idCentro_inexistente;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--Si se dispara esta excepción hay error, ese p_idCentro no es correcto
RAISE_APPLICATION_ERROR ('-20002','Error: '||sqlerrm);
WHEN TOO_MANY_ROWS THEN
NULL;
END;
-- Fin del bloque de comprobación de id_Centro inexistente
-- Inserta Centro
UPDATE centro SET provincia = p_provincia WHERE centro.idCentro = p_idCentro
-- Comprobar
IF SQL%FOUND
THEN
COMMIT;
END IF;
EXCEPTION
WHEN e_idCentro_inexistente THEN
RAISE_APPLICATION_ERROR ('-20001','Err. id de Centro inexistente');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR ('-20003','Error: '||sqlerrm);
END cambiar_provincia;