-
Notifications
You must be signed in to change notification settings - Fork 0
/
03_gest_depart_cuerpo.sql
153 lines (139 loc) · 4.4 KB
/
03_gest_depart_cuerpo.sql
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
CREATE OR REPLACE PACKAGE BODY gest_depart AS
-- Función privada
FUNCTION buscar_depart_por_nombre
(p_nom_dep VARCHAR2)
RETURN NUMBER;
PROCEDURE insert_depart(
p_nom_dep VARCHAR2,
p_loc VARCHAR2)
AS
v_ultimo_dep DEPART.DEPT_NO%TYPE;
e_nombre_repetido EXCEPTION;
v_nom_dep depart.DNOMBRE%TYPE;
BEGIN
-- Comprobar dpt repetido(Puede disparar NO_DATA_FOUND)
SELECT dnombre INTO v_nom_dep FROM depart
WHERE upper(dnombre) = UPPER(p_nom_dep);
RAISE e_nombre_repetido;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Calcular el número de departamento e insertar
SELECT MAX(DEPT_NO) INTO v_ultimo_dep FROM DEPART;
-- Como hay una funcion de grupo no funciona la exception NO_DATA_FOUND
IF v_ultimo_dep IS NULL
THEN
--Si la tabla departamento esta vacia, es decir, no hay ningun departamento
INSERT INTO DEPART VALUES (10,upper(p_nom_dep),upper(p_loc));
ELSE
INSERT INTO DEPART VALUES (v_ultimo_dep+10, p_nom_dep,p_loc);
END IF;
WHEN e_nombre_repetido THEN
RAISE_APPLICATION_ERROR ('-20001','Err. Nombre de departamento duplicado');
--Fin comprobación de departamento repetido
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR('-20999','Error desconocido');
END insert_depart;
-- **************************************************************
PROCEDURE borrar_depart
(p_dep_borrar NUMBER,
p_dep_nue NUMBER)
AS
v_dept_no depart.dept_no%TYPE;
BEGIN
-- Comprobar que existe el departamento a borrar
SELECT dept_no INTO v_dept_no
FROM depart
WHERE dept_no=p_dep_borrar;
SELECT dept_no INTO v_dept_no
FROM depart
WHERE dept_no=p_dep_nue;
UPDATE emple SET dept_no = p_dep_nue
WHERE DEPT_NO=p_dep_borrar;
DELETE FROM depart WHERE dept_no = p_dep_borrar;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR('-20011','Err. Nombre Departamento no encontrado');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR('-20999','Error desconocido');
END borrar_depart;
-- **************************************************************
PROCEDURE cambiar_localidad(
p_num_dep NUMBER,
p_loc VARCHAR2)
AS
e_dept_no_encontrado EXCEPTION;
BEGIN
UPDATE depart
SET LOC=p_loc
WHERE dept_no=p_num_dep;
IF SQL%NOTFOUND
THEN
RAISE e_dept_no_encontrado;
END IF;
EXCEPTION
WHEN e_dept_no_encontrado THEN
RAISE_APPLICATION_ERROR('-20011','Err Nombre Departamento no encontrado');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR('-20999','Error desconocido');
END cambiar_localidad;
-- ************************************************************
PROCEDURE visualizar_lista_depart
(c_depart OUT tcursor)
AS
BEGIN
OPEN c_depart FOR
SELECT dept_no,dnombre,loc FROM depart;
END visualizar_lista_depart;
-- *************************************************************
PROCEDURE visualizar_datos_depart
(p_num_dep IN OUT NUMBER,
p_nom_dep OUT VARCHAR2,
p_loc_dep OUT VARCHAR2,
p_num_empleados OUT NUMBER)
AS
BEGIN
SELECT dept_no, dnombre, loc INTO p_num_dep,p_nom_dep,p_loc_dep
FROM depart
WHERE DEPT_NO=p_num_dep;
SELECT NVL(COUNT(*),0) INTO p_num_empleados
FROM EMPLE
WHERE DEPT_NO=p_num_dep;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR('-20021','Err Cod. Departamento no encontrado');
END visualizar_datos_depart;
-- *************************************************************
-- Versión sobrecargada
PROCEDURE visualizar_datos_depart
(p_nom_dep IN VARCHAR2,
c_depart OUT tcursor,
p_num_empleados OUT NUMBER)
AS
p_num_dep depart.dept_no%TYPE;
BEGIN
p_num_dep:=buscar_depart_por_nombre(p_nom_dep);
OPEN c_depart FOR
SELECT *
FROM depart
WHERE dept_no=p_num_dep;
SELECT COUNT(*) INTO p_num_empleados FROM EMPLE
WHERE dept_no=p_num_dep;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR('-20021','Err Cod. Departamento no encontrado');
END visualizar_datos_depart;
FUNCTION buscar_depart_por_nombre
(p_nom_dep VARCHAR2)
RETURN NUMBER
AS
p_num_dep depart.dept_no%TYPE;
BEGIN
SELECT dept_no INTO p_num_dep FROM depart
WHERE DNOMBRE = p_nom_dep;
RETURN p_num_dep;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR('-20011','Err Nombre Departamento no encontrado');
END buscar_depart_por_nombre;
-- *************************************************************
END gest_depart;