Guía PL‐SQL - Irene-Frias/1DAM GitHub Wiki

Estructuras de Control

Condicional IF

DECLARE
  v_edad NUMBER := 20;
BEGIN
  -- Verifica si la persona es mayor de edad
  IF v_edad >= 18 THEN
    DBMS_OUTPUT.PUT_LINE('Es mayor de edad');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Es menor de edad');
  END IF;
END;

Condicional CASE

DECLARE
  v_dia NUMBER := 3;
BEGIN
  -- Usa CASE para decidir qué día es
  CASE v_dia
    WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Lunes');
    WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Martes');
    WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Miércoles');
    ELSE DBMS_OUTPUT.PUT_LINE('Otro día');
  END CASE;
END;

Condicional FOR

BEGIN
  -- Bucle que va de 1 a 5
  FOR i IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('Contador: ' || i);
  END LOOP;
END;

Bucle WHILE

BEGIN
  -- Bucle que va de 1 a 5
  FOR i IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('Contador: ' || i);
  END LOOP;
END;

Bucle LOOP

DECLARE
    v_num NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE('Número: ' || v_num);

        -- Aumentar el contador
        v_num := v_num + 1;

        -- Salir del bucle cuando v_num > 5
        EXIT WHEN v_num > 5;
    END LOOP;
END;

Cursores

Cursor explícito

DECLARE
    -- Cursor que selecciona empleados y calcula su ratio de ventas/cuota
    CURSOR c_empleados IS
        SELECT numempl, ventas, cuota, (ventas / cuota) AS ratio
        FROM empleado;

    -- Variable tipo fila para almacenar los datos del cursor
    v_emp c_empleados%ROWTYPE;
BEGIN
    -- Abrir el cursor
    OPEN c_empleados;

    -- Primera lectura del cursor
    FETCH c_empleados INTO v_emp;

    -- Bucle que recorre los registros del cursor
    WHILE c_empleados%FOUND LOOP

        -- Mostrar la información del empleado y su ratio
        DBMS_OUTPUT.PUT_LINE('Empleado: ' || v_emp.numempl ||
                             ' | Ventas: ' || v_emp.ventas ||
                             ' | Cuota: ' || v_emp.cuota ||
                             ' | Ratio: ' || ROUND(v_emp.ratio, 2));

        -- Leer el siguiente registro
        FETCH c_empleados INTO v_emp;
    END LOOP;

    -- Cerrar el cursor
    CLOSE c_empleados;
END;

Subprogramas

Procedimiento

-- Se crea o reemplaza un procedimiento llamado nombreProcedimiento
CREATE OR REPLACE PROCEDURE nombreProcedimiento
IS
    -- Declaración de variables adicionales (si es necesario)
    porcentaje NUMBER(10,3);

    -- Cursor para recorrer empleados con su ratio (ventas/cuota)
    CURSOR c_cursor IS
        SELECT numempl, (ventas/cuota) AS ratio
        FROM empleado;

    -- Variable para almacenar cada fila del cursor
    v_cursor c_cursor%ROWTYPE;
BEGIN
    -- Abrir el cursor
    OPEN c_cursor;

        -- Primera lectura del cursor
        FETCH c_cursor INTO v_cursor;

    -- Bucle para recorrer cada fila mientras haya datos
    WHILE c_cursor%FOUND LOOP

        -- Aquí puedes usar los datos: v_cursor.numempl y v_cursor.ratio
        DBMS_OUTPUT.PUT_LINE('Empleado: ' || v_cursor.numempl || 
                             ' - Ratio ventas/cuota: ' || ROUND(v_cursor.ratio, 3));

        -- Leer el siguiente registro
        FETCH c_cursor INTO v_cursor;
    END LOOP;

    -- Cerrar el cursor
    CLOSE c_cursor;
END nombreProcedimiento;
-- Pueden usarse algunos de estos para comprobarlos 
BEGIN
  nombreProcedimiento();
END;
 
CALL nombreProcedimiento();

EXEC nombreProcedimiento();

Función

-- Se crea o reemplaza una función llamada nombreDeFuncion
CREATE OR REPLACE FUNCTION nombreDeFuncion (
    nombreRecurso VARCHAR2  -- Parámetro de entrada: nombre del recurso
) 
RETURN NUMBER  -- La función devuelve un número (cantidad de rutas)
IS
    totalRutas NUMBER(3);  -- Variable para almacenar el total de rutas encontradas
BEGIN
    /* 
       Contar cuántas rutas están asociadas al recurso con el nombre especificado.
       Se usa COUNT(*) con INTO para guardar el resultado en totalRutas.
       Las tablas 'recurso' y 'usa' se relacionan por el campo 'codigo' y 'recurso'.
    */
    SELECT COUNT(*) INTO totalRutas
    FROM recurso r
    JOIN usa u ON r.codigo = u.recurso
    WHERE r.nombre = nombreRecurso;

    -- Se devuelve el resultado de la función
    RETURN totalRutas;    
END nombreDeFuncion;
-- Bloque anónimo para probar la función
DECLARE
    v_nombreRecurso VARCHAR2(50) := 'Proyector';  -- Puedes cambiar este valor
    v_total NUMBER;  -- Variable que recibirá el resultado
BEGIN
    -- Llamada a la función y almacenamiento del resultado
    v_total := nombreDeFuncion(v_nombreRecurso);

    -- Mostrar el resultado por consola
    DBMS_OUTPUT.PUT_LINE('Total de rutas que usan el recurso: ' || v_total);
END;