Funciones y Procedimientos en PL/SQL: Ejemplos Prácticos con Oracle

Informática5,39 KB

Funciones y procedimientos en PL/SQL

A continuación se presentan ejemplos prácticos de funciones y procedimientos almacenados en PL/SQL sobre una tabla LICEO.

1. Función de suma

Crear una función que devuelva la suma de dos números:

CREATE OR REPLACE FUNCTION FN_SUMA(P_NUM1 NUMBER, P_NUM2 NUMBER) RETURN NUMBER
IS
  V_SUMA NUMBER := 0;
BEGIN
  V_SUMA := P_NUM1 + P_NUM2;
  RETURN V_SUMA;
END;
/

SELECT FN_SUMA(7,8) FROM DUAL;

DECLARE
  V_RESULTADO NUMBER := 0;
BEGIN
  V_RESULTADO := FN_SUMA(7,8);
  DBMS_OUTPUT.PUT_LINE('LA SUMA ES: ' || V_RESULTADO);
END;

2. Función que determina si un empleado está jubilado

Crear una función que permita determinar si un empleado está jubilado según su edad:

CREATE OR REPLACE FUNCTION FN_JUBILA(P_EDAD NUMBER) RETURN VARCHAR2
IS
  V_RESULTADO VARCHAR2(30);
BEGIN
  IF P_EDAD > 65 THEN
    V_RESULTADO := 'JUBILÓ';
  ELSE
    V_RESULTADO := 'NO JUBILÓ';
  END IF;
  RETURN V_RESULTADO;
END;
/

SELECT FN_JUBILA(33) FROM DUAL;

3. Función que suma las horas adjudicadas de un profesor

Crear una función que sume las horas adjudicadas de un profesor:

SELECT NOMBRE, HRS_ADJUDICADAS FROM LICEO WHERE NOMBRE = 'Abreu Adriana';
-- ORDER BY NOMBRE;
-- SELECT SUM(HRS_ADJUDICADAS) FROM LICEO WHERE NOMBRE = 'Abreu Adriana';

CREATE OR REPLACE FUNCTION FN_TOTAL_HRS(P_NOMBRE VARCHAR2) RETURN NUMBER
IS
  V_TOTAL NUMBER := 0;
BEGIN
  -- SELECT SUM(HRS_ADJUDICADAS) INTO V_TOTAL FROM LICEO WHERE NOMBRE = P_NOMBRE;
  SELECT SUM(HRS_ADJUDICADAS) INTO V_TOTAL FROM LICEO WHERE UPPER(NOMBRE) = UPPER(P_NOMBRE);
  RETURN V_TOTAL;
END;
/

SELECT FN_TOTAL_HRS('Abreu Adriana') FROM DUAL;

4. Función que presenta el total de profesores de un liceo

Crear una función que devuelva el número de profesores de un liceo en particular:

-- SELECT LICEO, NOMBRE FROM LICEO WHERE LICEO = 'FDS';
SELECT COUNT(NOMBRE) FROM LICEO WHERE LICEO = 'FDS';

CREATE OR REPLACE FUNCTION FN_NUM_PROFE(P_LICEO VARCHAR2) RETURN NUMBER
IS
  V_TOTAL NUMBER := 0;
BEGIN
  SELECT COUNT(NOMBRE) INTO V_TOTAL FROM LICEO WHERE UPPER(LICEO) = UPPER(P_LICEO);
  RETURN V_TOTAL;
END;
/

SELECT FN_NUM_PROFE('PIRIÁPOLIS') FROM DUAL;

5. Función que cuenta profesores por rango de fechas de ingreso

Crear una función que presente la cantidad de profesores que ingresaron entre dos fechas:

SELECT COUNT(NOMBRE) FROM LICEO WHERE FECHA_INGRESO BETWEEN '01-01-2005' AND '31-12-2005';

CREATE OR REPLACE FUNCTION FN_NUM_FECHA(P_FI DATE, P_FT DATE) RETURN NUMBER
IS
  V_TOTAL NUMBER := 0;
BEGIN
  SELECT COUNT(NOMBRE) INTO V_TOTAL FROM LICEO WHERE FECHA_INGRESO BETWEEN P_FI AND P_FT;
  RETURN V_TOTAL;
END;
/

SELECT FN_NUM_FECHA('01-01-2000','31-12-2005') FROM DUAL;

6. Procedimiento que lista profesores por asignatura

Crear un procedimiento que muestre en columnas el nombre y liceo de los profesores de una asignatura en especial:

CREATE OR REPLACE PROCEDURE PR_LISTA_ASIG(P_ASIGNATURA VARCHAR2)
IS
  CURSOR C_PROFE IS
    SELECT NOMBRE, LICEO FROM LICEO WHERE UPPER(ASIGNATURA) = UPPER(P_ASIGNATURA);
  REG_PROFE C_PROFE%ROWTYPE;
BEGIN
  OPEN C_PROFE;
  LOOP
    FETCH C_PROFE INTO REG_PROFE;  -- FETCH funciona como un FOREACH
    EXIT WHEN C_PROFE%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(RPAD(REG_PROFE.NOMBRE, 30) || RPAD(REG_PROFE.LICEO, 30));
  END LOOP;
  CLOSE C_PROFE;
END;
/

EXECUTE PR_LISTA_ASIG('LITERATURA');

7. Procedimiento para modificar las horas adjudicadas de un profesor

Crear un procedimiento que permita modificar las horas adjudicadas de un profesor en un liceo:

SELECT NOMBRE, LICEO, HRS_ADJUDICADAS FROM LICEO
WHERE NOMBRE = 'Diaz Walter' AND LICEO = 'Barros Blancos';

UPDATE LICEO SET HRS_ADJUDICADAS = 40
WHERE NOMBRE = 'Diaz Walter' AND LICEO = 'Barros Blancos';

CREATE OR REPLACE PROCEDURE PR_CAMBIO_HRS(P_PROFESOR VARCHAR2, P_LICEO VARCHAR2, P_HRS NUMBER)
IS
BEGIN
  UPDATE LICEO SET HRS_ADJUDICADAS = P_HRS
  WHERE UPPER(NOMBRE) = UPPER(P_PROFESOR) AND UPPER(LICEO) = UPPER(P_LICEO);
  DBMS_OUTPUT.PUT_LINE('ACTUALIZACIÓN REALIZADA');
END;
/

EXECUTE PR_CAMBIO_HRS('DIAZ WALTER', 'BARROS BLANCOS', 30);

8. Procedimiento que organiza los profesores por liceo

Crear un procedimiento que organice en grupos a los profesores por liceo, mostrando nombre, asignatura y carácter (efectivo o suplente):

SELECT NOMBRE, LICEO, CARACTER, ASIGNATURA FROM LICEO WHERE LICEO = 'FDS';
SELECT LICEO FROM LICEO GROUP BY LICEO;

CREATE OR REPLACE PROCEDURE PR_PROF_LICEO
IS
  CURSOR C_LICEO IS SELECT LICEO FROM LICEO GROUP BY LICEO;
  CURSOR C_PROFE(P_LICEO VARCHAR2) IS
    SELECT NOMBRE, LICEO, CARACTER, ASIGNATURA FROM LICEO WHERE LICEO = P_LICEO;
  REG_LICEO C_LICEO%ROWTYPE;
  REG_PROFE C_PROFE%ROWTYPE;
BEGIN
  OPEN C_LICEO;
  LOOP
    FETCH C_LICEO INTO REG_LICEO;
    EXIT WHEN C_LICEO%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('LICEO: ' || REG_LICEO.LICEO);
    DBMS_OUTPUT.PUT_LINE('-------------------------');
    OPEN C_PROFE(REG_LICEO.LICEO);
    LOOP
      FETCH C_PROFE INTO REG_PROFE;
      EXIT WHEN C_PROFE%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(RPAD(REG_PROFE.NOMBRE, 30) || RPAD(REG_PROFE.ASIGNATURA, 30) || RPAD(REG_PROFE.CARACTER, 20));
    END LOOP;
    CLOSE C_PROFE;
  END LOOP;
  CLOSE C_LICEO;
END;
/

EXECUTE PR_PROF_LICEO;

Descargar

PDF Word HTML