Exercise 5 — Introducción a PL/SQL
PL/SQL (Procedural Language / SQL) es la extensión de Oracle que permite combinar SQL con lógica de programación: variables, condicionales y ciclos, todo dentro de la base de datos.
Estructura de un bloque anónimo
Todo bloque PL/SQL tiene tres secciones:
DECLARE
-- Aquí se declaran variables y constantes
BEGIN
-- Aquí va la lógica del programa
EXCEPTION
-- (Opcional) Aquí se manejan errores
END;
Condicional IF — ¿Es hoy un número primo?
DECLARE
vn_current_date NUMBER := TO_NUMBER(TO_CHAR(SYSDATE, 'DD'));
BEGIN
IF vn_current_date IN (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31) THEN
DBMS_OUTPUT.PUT_LINE('HOLA PRIMO');
ELSE
DBMS_OUTPUT.PUT_LINE('NO ES PRIMO');
END IF;
END;
GOTO — Salto de etiquetas
DECLARE
vn_current_date NUMBER := TO_NUMBER(TO_CHAR(SYSDATE, 'DD'));
BEGIN
IF vn_current_date IN (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31) THEN
GOTO primo;
ELSE
GOTO noprimo;
END IF;
<<primo>>
DBMS_OUTPUT.PUT_LINE('HOLA PRIMO');
<<noprimo>>
DBMS_OUTPUT.PUT_LINE('NO ES PRIMO');
END;
WHILE LOOP — Serie Fibonacci ≤ 100
DECLARE
vn_a NUMBER := 0;
vn_b NUMBER := 1;
BEGIN
WHILE vn_a <= 100 LOOP
DBMS_OUTPUT.PUT_LINE(vn_a);
vn_b := vn_a + vn_b;
vn_a := vn_b - vn_a;
END LOOP;
END;
WHILE LOOP — Mínimo Común Múltiplo (MCM)
SET SERVEROUTPUT ON;
DECLARE
vn_a NUMBER := 12;
vn_b NUMBER := 16;
vn_m NUMBER := GREATEST(vn_a, vn_b);
BEGIN
WHILE MOD(vn_m, LEAST(vn_a, vn_b)) <> 0 LOOP
vn_m := vn_m + GREATEST(vn_a, vn_b);
END LOOP;
DBMS_OUTPUT.PUT_LINE('MCM: ' || vn_m);
END;
FOR LOOP — Raíz aproximada de un número
DECLARE
vn_b NUMBER := 8;
vn_i NUMBER;
vn_raiz NUMBER;
BEGIN
vn_raiz := 0;
FOR vn_i IN 1..vn_b LOOP
IF vn_i * vn_i > vn_b THEN
EXIT;
END IF;
vn_raiz := vn_i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Raíz aproximada de ' || vn_b || ' = ' || vn_raiz);
END;