Fixing PL/SQL Procedures, Functions and Triggers for School Database

Classified in Spanish

Written on in English with a size of 5.25 KB

Corrected PL/SQL Procedures, Functions and Triggers

1. Procedure listarDepto

create or replace procedure listarDepto(p_codde depto.codde%TYPE, p_codcat catego.codcat%TYPE) IS


CURSOR c_depto IS
select nomde from depto where codde=p_codde;
v_depto c_depto%ROWTYPE;


CURSOR c_catego IS
select nomcat from catego where codcat=p_codcat;
v_catego c_catego%ROWTYPE;


CURSOR c_emple IS
select nomem from emple where codcat=p_codcat AND codde=p_codde;
v_nomem emple.nomem%TYPE;
v_cuantos number;


BEGIN
OPEN c_depto;
FETCH c_depto INTO v_depto;
IF c_depto%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('NO EXISTE EL CODIGO DE DEPARTAMENTO');
ELSE
DBMS_OUTPUT.PUT_LINE('DEPARTAMENTO ' || v_depto.nomde);
OPEN c_catego;
FETCH c_catego INTO v_catego;
IF c_catego%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('NO EXISTE ESA CATEGORIA LABORAL');
ELSE
DBMS_OUTPUT.PUT_LINE('CATEGORIA ' || v_catego.nomcat);
OPEN c_emple;
FETCH c_emple INTO v_nomem;
IF c_emple%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('NO EXISTEN EMPLEADOS CON LA CATEGORIA ' || p_codcat || ' EN EL DEPARTAMENTO ' || p_codde);
ELSE
WHILE c_emple%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_nomem);
FETCH c_emple INTO v_nomem;
END LOOP;
END IF;
END IF;
END IF;
END listarDepto;


2. Function consultarJefesCentro

create or replace function consultarJefesCentro(p_codce centro.codce%TYPE, p_tidir depto.tidir%TYPE, p_salar emple.salar%TYPE) RETURN number IS
CURSOR c_centro IS
select 'x' from centro where codce=p_codce;
CURSOR c_cuantos IS
select count(*) from depto, emple
where depto.codjefe=emple.codem AND depto.codce=p_codce AND depto.tidir=p_tidir AND emple.salar=p_salar;
v_existe char;
v_cuantos number;
BEGIN
OPEN c_centro;
FETCH c_centro INTO v_existe;
IF c_centro%NOTFOUND THEN
RETURN -1;
ELSIF p_tidir <> 'F' AND p_tidir <> 'P' THEN
RETURN -2;
ELSIF p_salar < 0 THEN
RETURN -3;
ELSE
OPEN c_cuantos;
FETCH c_cuantos INTO v_cuantos;
CLOSE c_cuantos;
RETURN v_cuantos;
END IF;
END consultarJefesCentro;


3. Anonymous Block (Calling the Function)

DECLARE
v_cuantos number;
v_codce centro.codce%TYPE := &centro;
v_tidir depto.tidir%TYPE := &tipodireccion;
v_salar emple.salar%TYPE := &salario;
BEGIN
v_cuantos := consultarJefesCentro(v_codce, v_tidir, v_salar);
IF v_cuantos = -1 THEN
DBMS_OUTPUT.PUT_LINE('NO EXISTE EL CODIGO DE CENTRO');
ELSIF v_cuantos = -2 THEN
DBMS_OUTPUT.PUT_LINE('NO ES UN TIPO DE DIRECCION CORRECTA');
ELSIF v_cuantos = -3 THEN
DBMS_OUTPUT.PUT_LINE('EL SALARIO NO PUEDE SER NEGATIVO');
ELSE
DBMS_OUTPUT.PUT_LINE('EN LA EMPRESA HAY ' || v_cuantos || ' JEFES CON EL TIPO DIR ' || v_tidir || ' EN EL CENTRO ' || v_codce || ' CON SALARIO ' || v_salar);
END IF;
END;


4. Trigger controlClases

CREATE OR REPLACE TRIGGER controlClases BEFORE INSERT ON CLASE FOR EACH ROW
DECLARE
CURSOR c_profe IS
select 'x' from profesor where coddepar=:new.coddepar and ordenprofe=:new.ordenprofe;
v_profe c_profe%ROWTYPE;
CURSOR c_asigna IS
select codciclo, curso, coddepar from asigna where codasigna=:new.codasigna;
v_asigna c_asigna%ROWTYPE;
CURSOR c_grupo IS
select codciclo, curso from grupo where codgrupo=:new.codgrupo;
v_grupo c_grupo%ROWTYPE;
v_cuantos_grupo_profe number;
BEGIN
OPEN c_profe;
OPEN c_asigna;
OPEN c_grupo;
FETCH c_profe INTO v_profe;
FETCH c_asigna INTO v_asigna;
FETCH c_grupo INTO v_grupo;
IF c_profe%FOUND AND c_grupo%FOUND AND c_asigna%FOUND THEN
IF v_profe.coddepar <> v_asigna.coddepar THEN
RAISE_APPLICATION_ERROR(-20001, 'Error: profesor y asignatura no son del mismo ciclo');
END IF;
IF v_grupo.codciclo <> v_asigna.codciclo THEN
RAISE_APPLICATION_ERROR(-20002, 'Error grupo y asignatura no son del mismo ciclo');
END IF;
IF v_grupo.curso <> v_asigna.curso THEN
RAISE_APPLICATION_ERROR(-20003, 'Error grupo y asignatura no son del mismo curso');
END IF;
SELECT COUNT(DISTINCT codgrupo) INTO v_cuantos_grupo_profe FROM clase WHERE coddepar = :new.coddepar AND ordenprofe = :new.ordenprofe;
IF v_cuantos_grupo_profe > 5 THEN
RAISE_APPLICATION_ERROR(-20004, 'Un profesor no puede dar clase a mas de 5 grupos');
END IF;
END IF;
CLOSE c_profe;
CLOSE c_asigna;
CLOSE c_grupo;
END controlClases;

Related entries: