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;