3. Estructuras de Control en PL/SQL

Contenido

Las estructuras de control en PL/SQL (Procedural Language/SQL) son elementos fundamentales que permiten controlar el flujo de ejecución de un bloque de código. Estas estructuras permiten que el programa realice decisiones, repita acciones o ejecute instrucciones dependiendo de ciertas condiciones. Las principales estructuras de control en PL/SQL son:

1. Sentencias IF, CASE y LOOP

1.1  IF

La sentencia IF en PL/SQL se utiliza para realizar una evaluación condicional en un bloque de código. Esta sentencia permite ejecutar cierto bloque de código si una condición especificada es verdadera, y otro bloque si la condición es falsa. La estructura básica es:

				
					IF condicion1 THEN
    -- Bloque de código si la condición es verdadera
ELSIF condicion2 THEN
    -- Bloque de código si la condición1 es falsa (opcional)
ELSE
    -- Bloque de código si la condición2 es falsa (opcional)
END IF;

				
			
  • condition es la condición que se evalúa. Puede ser cualquier expresión booleana.
  • THEN marca el comienzo del bloque de código que se ejecutará si la condición es verdadera.
  • ELSIF es una cláusula opcional que permite evaluar otra condición si la primera es falsa.
  • ELSE es una cláusula opcional que especifica un bloque de código que se ejecutará si ninguna de las condiciones anteriores es verdadera.
  • END IF marca el final del bloque IF.

 

La sentencia IF es fundamental en la lógica de control de flujo en PL/SQL, ya que permite que el programa tome decisiones basadas en condiciones específicas, lo que lo hace especialmente útil para ejecutar diferentes bloques de código en función de diferentes escenarios.

Supongamos que queremos escribir un bloque PL/SQL que verifique si un número es positivo, negativo o cero e imprima un mensaje correspondiente:

				
					DECLARE
    -- Declaramos la variable 'num'
    num NUMBER := 10; -- Valor a comprobar
BEGIN
    -- Flujo del programa:
    IF num > 0 THEN
        DBMS_OUTPUT.PUT_LINE('El número es positivo.');
    ELSIF num < 0 THEN
        DBMS_OUTPUT.PUT_LINE('El número es negativo.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('El número es cero.');
    END IF;
END;
/

				
			

En este ejemplo:

  • La variable num está inicializada con el valor 10, pero puedes cambiarlo para probar diferentes casos.
  • La sentencia IF evalúa si num es mayor que 0. Si es verdadero, imprime «El número es positivo.».
  • Si la primera condición es falsa, se evalúa la siguiente condición con ELSIF. Si num es menor que 0, imprime «El número es negativo.».
  • Si ninguna de las condiciones anteriores es verdadera, se ejecuta el bloque dentro de ELSE, lo que significa que num es igual a 0 y se imprime «El número es cero.».

 

Este es solo un ejemplo básico para demostrar cómo se utiliza la sentencia IF en PL/SQL para tomar decisiones basadas en condiciones específicas.

Ejercicio Nº 1 : Estructuras IF ELSE

Desarrollar un bloque en anónimo que utilice una variable de sustitución.
El programa solicitará la inclusión de un número entre 0 y 100 (si el valor esta fuera de este rango, se mostrara un mensaje que indicará que valor no es válido).
En el caso de que el valor estén en el rango de 0 a 100, comprobaremos el número y si es igual a 10, 20 o 30, el programa nos mostrara un mensaje indicándonos que hemos ganado el primer premio, segundo premio o tercer premio respectivamente, finalmente si el número es diferente a estos 3, nos indicará que el número no ha sido agraciado.

<< Resolución >>

1.2  CASE

La sentencia CASE se utiliza para realizar diferentes acciones basadas en el valor de una expresión. La estructura básica es:

				
					CASE expresion
    WHEN valor1 THEN
        -- Bloque de código si la expresión es igual a valor1
    WHEN valor2 THEN
        -- Bloque de código si la expresión es igual a valor2
    ...
    ELSE
        -- Bloque de código si la expresión no coincide con ningún valor (opcional)
END CASE;

				
			

1.3  LOOP

La sentencia LOOP se utiliza para crear bucles infinitos o iteraciones controladas manualmente mediante sentencias de salida. La estructura básica es:

				
					LOOP
    -- Bloque de código a ejecutar en cada iteración
    EXIT WHEN condicion_salida; -- Sentencia opcional para salir del bucle
END LOOP;

				
			

2. Iteradores FOR y WHILE

FOR: El iterador FOR se utiliza para realizar un bucle un número específico de veces. Puedes especificar un rango de valores o una lista de elementos sobre los cuales iterar. La estructura básica es:

				
					FOR variable IN inicio..fin LOOP
    -- Bloque de código a ejecutar en cada iteración
END LOOP;

				
			
				
					FOR variable IN lista_de_valores LOOP
    -- Bloque de código a ejecutar en cada iteración
END LOOP;

				
			

WHILE: El iterador WHILE se utiliza para realizar un bucle mientras se cumpla una condición específica. La estructura básica es:

				
					WHILE condicion LOOP
    -- Bloque de código a ejecutar en cada iteración
END LOOP;

				
			

Ejercicio Nº 2 : Estructuras IF ELSE

En este ejercicio realizaremos un bloque anónimo en PL/SQL con los bucles LOOP, WHILE y FOR. Cada bucle se ejecutará de forma cíclica 10 veces y mostrara por pantalla el tipo de bucle que estamos usando y la iteración ejecutada, es decir, para cada bucle obtendremos la siguiente salida:


Estoy dentro del bucle LOOP en la iteración: 1
Estoy dentro del bucle LOOP en la iteración: 2

Bucle LOOP en la iteración: 10

Bucle WHILE en la iteración: 1
Bucle WHILE en la iteración: 2

Bucle WHILE en la iteración: 10

Bucle FOR en la iteración: 1
Estoy dentro del bucle FOR en la iteración: 2

Estoy dentro del bucle FOR en la iteración: 10


En definitiva los 3 bloques ejecutarán exactamente la misma tarea.

 

<< Resolución >>

3. Uso de cursores explícitos e implícitos

3.1 Qué son los cursores?

Los cursores en PL/SQL son estructuras de control que permiten procesar filas de resultados devueltas por una consulta SQL de manera secuencial.

Los cursores son herramientas fundamentales para el procesamiento de datos y la manipulación de resultados de consultas SQL en bloques de código, proporcionando flexibilidad y control sobre el acceso y la manipulación de datos en una base de datos Oracle. Tienen varias funciones y propósitos importantes:

  • Recorrer Resultados de Consultas: Los cursores se utilizan para recorrer los resultados de una consulta SQL uno por uno. Esto permite procesar cada fila de resultados individualmente en un bloque PL/SQL.

  • Manipulación de Datos: Los cursores proporcionan una forma de manipular y procesar datos recuperados de la base de datos. Esto puede incluir cálculos, transformaciones, validaciones u otras operaciones necesarias en los datos.

  • Operaciones de Actualización: Los cursores pueden utilizarse para realizar operaciones de actualización, inserción o eliminación en las filas de una tabla basadas en los resultados de una consulta.

  • Acceso a Datos Complejos: En situaciones donde se necesitan realizar operaciones complejas que no se pueden lograr con una simple sentencia SQL, los cursores permiten procesar los datos de manera más flexible y controlada.

  • Manejo de Excepciones: Los cursores pueden incluir manejo de excepciones para tratar errores que puedan ocurrir durante la ejecución de la consulta SQL o durante el procesamiento de los datos recuperados.

 

3.2 Tipos de Cursores

  • Cursores Implícitos: Los cursores implícitos son manejados automáticamente por Oracle durante la ejecución de sentencias SQL, como las sentencias SELECT. No necesitas declararlos explícitamente y su ciclo de vida está controlado por Oracle.

  • Cursores Explícitos: Los cursores explícitos son declarados y controlados explícitamente por el programador. Se utilizan cuando necesitas más control sobre el procesamiento de filas devueltas por una consulta. La estructura básica para trabajar con un cursor explícito es:

				
					DECLARE
    CURSOR nombre_cursor IS consulta;
    variable tipo_de_dato;
BEGIN
    OPEN nombre_cursor;
    LOOP
        FETCH nombre_cursor INTO variable;
        EXIT WHEN nombre_cursor%NOTFOUND;
        -- Procesar fila obtenida
    END LOOP;
    CLOSE nombre_cursor;
END;

				
			

Aquí, nombre_cursor es el nombre del cursor, consulta es la consulta SQL que define el conjunto de datos a procesar, variable es una variable para almacenar los valores de las filas recuperadas y FETCH INTO se utiliza para obtener los valores de las filas en la variable especificada. La sentencia EXIT WHEN se utiliza para salir del bucle cuando no hay más filas disponibles. Finalmente, el cursor se cierra con la sentencia CLOSE.