You are on page 1of 7

----mantenimiento de la tabla matricula

select* from matricula

----- no se guarda ni la fecha ni la hora ya que se guardan automaticamente

select pa_insertar_matricula (37,'2023-1')


select pa_insertar_matricula (85,'2023-1')
----insertar
create or replace function pa_insertar_matricula (alumno int, sem char(6) )
returns int as
$$
declare
v_alu int ;
begin --try
Select count(*) as v_alu into v_alu from matricula where alumno_id =alumno AND
codigo_semestre = sem;
if v_alu =0 then
INSERT INTO public.matricula(fecha_matricula, h_matricula, tipo_matricula,
alumno_id, codigo_semestre)
VALUES (current_date, current_time, true , alumno, sem);
return 0 ;--- inserta con exito
else
return 1 ;
end if;
Exception when others then
return -1 ;
End
$$ language 'plpgsql'

select pa_insertar_matricula (151,'2023-2')

---- eliminar
create or replace function pa_eliminar_matricula (ma int) returns boolean as
$$
declare
begin --try
if EXISTS(Select matricula_id from matricula where matricula_id=ma)
then
DELETE FROM public.matricula
WHERE matricula_id=ma;
return true ;
else
return false;
end if;
End
$$ language 'plpgsql'

select pa_eliminar_matricula (773)


select pa_eliminar_matricula (770)

select pa_eliminar_matricula (768)

select pa_eliminar_matricula (776)

----actualizar

create or replace function pa_actualizar_matricula (ma int , alumno int, sem


char(6) ) returns boolean as
$$
declare
begin --try
if EXISTS(Select matricula_id from matricula where matricula_id=ma) then
UPDATE public.matricula
SET alumno_id=alumno, codigo_semestre=sem
WHERE matricula_id=ma;
return true;--- inserta con exito
else
return false ;
end if;

End
$$ language 'plpgsql'

select pa_actualizar_matricula (14,200,'2023-1') ----agregar con int .a variable


de retorno

select * from matricula

order by 5

------

---1.- Implementar procedimientos almacenados para el mantenimiento de la tabla


alumno

---insertar

select*from ubigeo

create or replace function pa_insertar_alumno (tip char(1), num_doc varchar(50),


ape_pat varchar(50),
ape_mat
varchar(50), nom varchar(50),sex boolean ,f_nac date,
direc
varchar(200),estado char(1), esc int, ubi char(6),
sem_ingre
char(6),sem_egre char(6)) returns int as
$$
declare
begin --try
if exists(select codigo_semestre from semestre where codigo_semestre
=sem_ingre ) then
INSERT INTO public.alumno(tipo_documento, numero_documento, ape_paterno,
ape_materno, nombres, sexo, f_nacimiento, f_registro, direccion_residencia,
estado_alumno, escuela_id, ubigeo_id, semestre_ingreso, semestre_egreso)
VALUES (tip, num_doc, ape_pat, ape_mat, nom, sex, f_nac, current_date, direc,
estado,esc, ubi, sem_ingre, sem_egre );

return 0;
else
return 1 ;
end if ;
Exception when others then
return -1 ;
End
$$ language 'plpgsql'

select * from alumno


order by 9
select pa_insertar_alumno ('0','xxxxxx','yyy','yyy','yyy',true,'2003-07-
19','ddirecc','A',10,'010000','2023-1','2021-1')

----eliminar

create or replace function pa_eliminar_alumno (id_alum int) returns int as


$$
declare
begin --try
if exists(select alumno_id from alumno where alumno_id =id_alum ) then
DELETE FROM public.alumno
WHERE alumno_id =id_alum;
return 0;
else
return 1 ;
end if ;
Exception when others then
return -1 ;
End
$$ language 'plpgsql'

select pa_eliminar_alumno(162)

----actualizar

create or replace function pa_actualizar_alumno (id_alu int,tip char(1), num_doc


varchar(50), ape_pat varchar(50),
ape_mat
varchar(50), nom varchar(50),sex boolean ,f_nac date,
direc
varchar(200),estado char(1), esc int, ubi char(6),
sem_ingre
char(6),sem_egre char(6)) returns int as
$$
declare
begin --try
if exists(select codigo_semestre from semestre where codigo_semestre =sem_ingre
)
and Exists(select alumno_id from alumno where alumno_id = id_alu) then
UPDATE public.alumno
SET alumno_id=id_alu, tipo_documento=tip, numero_documento=num_doc,
ape_paterno=ape_pat, ape_materno=ape_mat,
nombres=nom, sexo=sex, f_nacimiento=f_nac, f_registro=current_date,
direccion_residencia=direc,
estado_alumno=estado, escuela_id=esc, ubigeo_id=ubi,
semestre_ingreso=sem_ingre, semestre_egreso=sem_egre
WHERE alumno_id = id_alu;
return 0;
else
return 1 ;
end if ;
Exception when others then
return -1 ;
End
$$ language 'plpgsql'

select pa_actualizar_alumno (162,'0','xxxxxx','ll','mmm','nayde',true,'2003-07-


19','ddirecc','A',10,'010000','2023-1','2021-1')

------2. Implementar una función que retorne un valor booleano si un alumno


--tiene aprobados los pre requisitos de un determinado curso.

create or replace function fn_aprobo_prerequisitos(alum int, curs int) returns bool


as
$$
Declare
n_cur int;
veces int;
begin

select coalesce(count(*),0) into veces


from matricula mt INNER JOIN detalle_matricula dtm on mt.matricula_id=
dtm.matricula_id
INNER JOIN grupo gp on gp.grupo_id=dtm.grupo_id
where nota_promedio>=13.5 and curso_id in (select curso_id_pre from curso_curso
where curso_id=curs) and alumno_id=alum;

select count(curso_id_pre) into n_cur from curso_curso where curso_id=curs;---


cuenta las veces que lleva un curso

if exists (select curso_id from curso_curso where curso_id=curs) then


if n_cur=veces then return true;
else return false;
end if;
else
if (select ciclo from curso where curso_id=curs)=1 then
return true; end if;
return false;
end if;
end;
$$
language 'plpgsql'

select*from alumno
order by 7
-- alumno :125 , curso:2
select cu.codigo_curso as Codigo , cu.nombre_curso as
Nombre_Curso ,cu1.nombre_curso ,
dmPre.nota_promedio as Nota_promedio
from detalle_matricula dm inner join matricula ma on ma.matricula_id =
dm.matricula_id
inner join alumno al on ma.alumno_id = al.alumno_id
inner join grupo gr on dm.grupo_id=gr.grupo_id
inner join curso cu on gr.curso_id = cu.curso_id
inner join curso_curso cuCu on cuCu.curso_id=cu.curso_id
inner join curso cu1 on cuCu.curso_id_pre = cu1.curso_id
LEFT JOIN detalle_matricula dmPre ON dmPre.matricula_id = ma.matricula_id AND
dmPre.curso_id = cuCu.curso_id_pre
where al.numero_documento = '73720161' and Cu.curso_id=2
GROUP by
cu.codigo_curso,cu.nombre_curso,cu1.nombre_curso,dmPre.nota_promedio,cuCu.curso_id_
pre

select*from detalle_matricula

select*from ambiente

-----cruze de horario ambiente


CREATE OR REPLACE FUNCTION vf_horario_ambiente(
dia_ho CHARACTER(1),
h_ini TIME,
h_fin TIME,
id_amb INTEGER,
id_gru INTEGER
) RETURNS BOOLEAN AS $$
DECLARE
contH INTEGER;
BEGIN
SELECT COUNT(*) INTO contH
FROM horario
WHERE dia = dia_ho
AND ambiente_id = id_amb
AND ((h_inicio < h_ini AND h_final > h_ini)
OR (h_inicio < h_fin AND h_final > h_fin))
AND grupo_id = id_gru;

IF contH = 0 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$$ LANGUAGE plpgsql;

select * from horario


select * from ambiente

select vf_horario_ambiente('1' , '16:00:00' , '18:00:00' , 1, 2)

----cruze de horario docente

CREATE OR REPLACE FUNCTION vf_horario_docente(


id_doc int,
dia_ho CHARACTER(1),
h_ini TIME,
h_fin TIME,
id_amb INTEGER,
id_gru INTEGER
) RETURNS BOOLEAN AS $$
DECLARE
contH INTEGER;
BEGIN
SELECT COUNT(*) INTO contH

WHERE doc.docente_id = id_doc and hr.dia = dia_ho


AND hr.ambiente_id = id_amb
AND ((hr.h_inicio < h_ini AND hr.h_final > h_ini)
OR (hr.h_inicio < h_fin AND hr.h_final > h_fin))
AND gr.grupo_id = id_gru;

IF contH = 0 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$$ LANGUAGE plpgsql;

select *
from

select vf_horario_docente('1' , '19:00:00' , '20:00:00' , 1 , 2)

-------3.detalle matricula insertar

create or replace function pa_matricula (mat int, grup int, est character(1), nota
numeric) returns int as
$$
DECLARE
promedio int; creditos int; totalcred int;
BEGIN
select sum(cu.creditosdm.nota_promedio) /sum(cu.creditos) into promedio
from alumno al inner join matricula ma on ma.alumno_id= al.alumno_id
inner join detalle_matricula dm on dm.matricula_id = ma.matricula_id
inner join grupo gr on dm.grupo_id = gr.grupo_id
inner join curso cu on gr.grupo_id = cu.curso_id
where gr.semestre_id = '2022-2' and al.alumno_id = 153;

case promedio
when promedio > 0 and promedio <= 10 then creditos = 16;
when promedio > 10 and promedio <= 15 then creditos = 22;
when promedio > 15 and promedio <=20 then creditos = 27;

if sum(cur.creditos) <= creditos then


INSERT INTO public.detalle_matricula(
matricula_id, grupo_id, estado, nota_promedio)
VALUES (mat, grup, est, nota);
return 0;
else
return 1;
end if;
end case;
exception when others then
return -1;
END;
$$ LANGUAGE 'plpgsql'

select from matricula


where alumno_id = 153
select * from detalle_matricula
where matricula_id = 712
select * from grupo
where semestre_id = '2023-1'

-----docente curce de horario


create or replace function pa_registrar_horario(dia_id character, inicio time,fin
time,aula integer,gps integer)
returns boolean
as
$$
declare

hor_id int;

begin

select max(horario_id) into hor_id from horario;


if not EXISTS(select gp.docente_id from horario hr INNER JOIN
grupo gp on hr.grupo_id=gp.grupo_id
where gp.grupo_id=gps and hr.h_inicio=inicio AND hr.h_final=fin
) then
insert into
horario(horario_id,dia,h_inicio,h_final,ambiente_id,grupo_id)values
(hor_id+1,dia_id,inicio,fin,aula,gps);
return true;
else
return false;
end if;
end;
$$ language 'plpgsql'

You might also like