-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEjercicios11-04.sql
233 lines (186 loc) · 6.29 KB
/
Ejercicios11-04.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
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
/* Clase del día 11/04/23
Ejercicios en clase. */
--1. Creo una base de datos llamada universidad
create database universidad
use universidad
--2. Creo las tablas alumno, materia e inscripcion(tabla intermedia)
create table alumno(
idAlumno numeric(18,0) primary key,
nombre nvarchar(30) not null,
apellido nvarchar(30) not null,
fechaAlta datetime not null,
fechaBaja datetime null,
fechaModificacion datetime not null
)
create table inscripcion(
idAlumno numeric not null,
idMateria numeric not null,
idTipoInscripcion numeric not null,
fechaDesde datetime not null,
fechaHasta datetime not null,
constraint PK_inscrpcion PRIMARY KEY (
idAlumno,
idMateria,
idTipoInscripcion,
fechaDesde,
fechaHasta)
)
create table materia(
idMateria numeric identity(1,1) not null,
descripcion nvarchar(30) not null,
fechaAlta datetime not null,
fechaBaja datetime null,
fechaModif datetime not null,
constraint PK_materia PRIMARY KEY (idMateria)
)
--Creo otra tabla de tipoInscripcion
create table tipoInscripcion(
idTipoInscripcion numeric identity(1,1) not null,
descripcion nvarchar(30) not null,
constraint PK_tipoInscripcion PRIMARY KEY (idTipoInscripcion)
)
--3. Creo las relaciones entre las tablas
--Incripcion y Alumno
ALTER TABLE inscripcion
ADD CONSTRAINT inscripcionAlumno
FOREIGN KEY (idAlumno) REFERENCES alumno(idAlumno)
--Incripcion y Materia
ALTER TABLE inscripcion
ADD CONSTRAINT inscripcionMateria
FOREIGN KEY (idMateria) REFERENCES materia(idMateria)
--Incripcion y TipoInscripcion
ALTER TABLE inscripcion
ADD CONSTRAINT inscripcionTipoInscripcion
FOREIGN KEY (idTipoInscripcion) REFERENCES tipoInscripcion(idTipoInscripcion)
--4. Crear un SP que inserte una materia
create procedure sp_materia_ins
@descripcion varchar(30)
as
insert into materia values(
@descripcion,
getdate(),
null,
getdate()
)
--Test-> pruebo si anda
exec sp_materia_ins 'Lógica'
select * from materia
--5. Crear un SP que devuelva el ID de una materia insertada
create procedure sp_materiaDevuelveID_ins
@descripcion varchar(30), --Parametro de entrada
@idMateria numeric output --Parametro de salida
as
begin
--Insertar registro
insert into materia values(
@descripcion,
getdate(),
null,
getdate()
)
--Devolver como parametro de salida al ID insertado.
--Asigna al parametro de salida el resultado de la funcion SCOPE_IDENTITY()
select @idMateria = SCOPE_IDENTITY()
end
--Test
--Declaro variable en donde guardo el ID insertado
declare @idMateriaInsertada numeric
--Ejecuto SP
exec sp_materiaDevuelveID_ins 'Materia ID Output', @idMateriaInsertada output
--Consulto el valor de la varable @idMateriaInsertada
select @idMateriaInsertada as 'VeoElIdInsertado'
--Consulto registros de la tabla.
select top 2 * from materia order by idMateria desc
--5. Escribir una vista que muestre el apellido del alumno, la descripción de la materia, la fechaDesde de la tabla inscripción y el idTipoInscripcion.
create view vInscripcionAlumno as
select
--La inicial de adelante es la tabla a la que pertenece
a.apellido as 'Apellido',
m.descripcion as 'Materia',
i.fechaDesde as 'Fecha Desde',
i.idTipoInscripcion as 'Id Tipo Inscripcion'
from
alumno a
inner join inscripcion i on i.idAlumno = a.idAlumno
inner join materia m on m.idMateria = i.idMateria
--Uso de la vista
--Traigo el campo de la vista
select Apellido, Materia from vInscripcionAlumno
select * from vInscripcionAlumno
--6. Cree una función que recibiendo como parámetro el idAlumno, devuelva como resultado la cantidad de materias a las que está inscripto.
create function cantidadDeMaterias(
@idAlumno numeric --Parametro de entrada
)
--Especificar el tipo de dato que devuelve
returns integer
as
begin
--Declaro la variable en donde voy a almacenar y el valor que devuelvo
declare @cantidadeDeMaterias integer
select @cantidadeDeMaterias =
count(*)
from
inscripcion i
where
i.idAlumno = @idAlumno and
i.idTipoInscripcion = 1
--Devuelve el contenido de la variable @cantidadeDeMaterias
return @cantidadeDeMaterias
end
--Uso de la funcion
--Entre parentesis va el idAlumno
select dbo.cantidadDeMaterias(1) as 'Cantidad'
select dbo.cantidadDeMaterias(2) as 'Cantidad'
--7. Hacer un procedimiento que busque los tipos de inscripción por su ID.
create procedure sp_tipoInscripcion_sel
@idTipoInscripcion numeric
as
select descripcion --Seleccionar el campo descripcion
from tipoInscripcion --Nombre tabla
where idTipoInscripcion = @idTipoInscripcion
--Uso del SP
sp_tipoInscripcion_sel '1' --Veo la cursada
sp_tipoInscripcion_sel '2' --Veo el final
--8. Cree una función que recibiendo como parámetro el idAlumno, una fecha desde y una fecha hasta, devuelva como resultado la cantidad de materias a las que está inscripto.
create function cantidadDeMateriasEntreDosFechas(
@idAlumno numeric, --Parametro de entrada
@fechaDesde datetime, --Parametro de entrada
@fechaHasta datetime --Parametro de entrada
)
--Especificar el tipo de dato que devuelve
returns integer
as
begin
--Declaro la variable en donde voy a almacenar y el valor que devuelvo
declare @cantidadeDeMaterias integer
select @cantidadeDeMaterias =
count(*)
from
inscripcion i
where
i.idAlumno = @idAlumno and
i.idTipoInscripcion = 1 and
i.fechaDesde >= @fechaDesde and
i.fechaHasta <= @fechaHasta
--Devuelve el contenido de la variable @cantidadeDeMaterias
return @cantidadeDeMaterias
end
--9. Crear un trigger que impida insertar dos tipos de inscripción con igual descripción.
CREATE TRIGGER trg_tipoInscripcion_INS
ON tipoInscripcion
INSTEAD OF INSERT
AS
BEGIN
DECLARE @descripcion nvarchar(30)
SELECT @descripcion = tipoInscripcion.descripcion FROM tipoInscripcion INNER JOIN inserted
ON inserted.descripcion = tipoInscripcion.descripcion
--Si no hay ninguna, finalmente inserto el registro
IF @descripcion IS NULL
BEGIN
INSERT INTO tipoInscripcion(descripcion)
SELECT descripcion FROM inserted
END
END
--Test
insert into tipoInscripcion values('Cursada')
select * from tipoInscripcion