Este tipo de subprogramas son menos conocidos que los procedimientos almacenados, funciones y triggers, pero son enormemente útiles.
Los bloques PL/SQL son unidades de código que se envían al servidor para que sean procesadas conjuntamente, obviamente esto es mejor para el rendimiento del sistema que si se envían las sentencias SQL separadamente una a una. Es decir, cuando se requiere la ejecución de un bloque PL/SQL, este es enviado al servidor PL/SQL donde se ejecuta el código PL/SQL y las sentencias SQL son enviadas al servidor Oracle, como el servidor PL/SQL reside en el servidor Oracle, el código se ejecuta eficientemente.
Un bloque de código PL/SQL contiene las siguientes secciones:
1. La sección de declaraciones donde se definen los distintos objetos que se van a utilizar en el bloque (variables, constantes, cursores, etcétera). Esta sección es opcional.
2. La sección de instrucciones. Sección obligatoria que contiene las sentencias ejecutables de SQL y PL/SQL.
3. La sección de excepciones. Es una sección opcional donde se tratan todos los errores que puedan surgir a la hora de ejecutar las sentencias SQL y PL/SQL de la sección de instrucciones.
Ejemplo de bloque:
Declare
v_depto emp.deptno%TYPE;
v_ename emp.ename%TYPE;
Begin
select ename into v_ename
from emp
where sal=(select Max(sal)
from emp
where deptno=&deptno);
DBMS_OUTPUT.PUT_LINE(v_ename);
END;
/
Ejemplo 2
DECLARE
d_producto producto.id_producto%type
BEGIN
SELECT id_producto
INTO d_producto
FROM producto
WHERE id_producto = &id_inventario;
DELETE FROM inventario
WHERE id_inventario = d_producto;
COMMIT ;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
INSERT INTO exception_table (message)
VALUES (‘ocurrió un error ’) ;
COMMIT ;
END ;
/
Estructuras básicas de control
Como PL/SQL es un lenguaje 3GL, cuenta con las estructuras típicas de control de flujo: bifurcaciones condicionales y bucles:
Bifurcaciones condicionales
La sintaxis básica es:
IF condición_1 THEN Se ejecuta si se cumple condicion_1 ELSIF condicion_2 THEN –- ojo a ‘ELSIF’ y no ELSEIF Se ejecuta si no se cumple condicion_1 y se cumple condicion_2 ELSE Se ejecuta si no se cumple condicion_1 ni condicion_2 END IF;
Como en cualquier lenguaje de programación, las estructuras IF se pueden anidar unas dentro de otras.
Bucles Existen varias variantes de la estructura bucle. La más sencilla es la siguiente:
LOOP sentencias END LOOP;
Las sentencias de dentro del bucle se ejecutarán durante un número indefinido de vueltas, hasta que aparezca la instrucción EXIT; que finalizará el bucle. Este tipo de bucle se denomina bucle incondicional.
Otra opción es incluir la estructura EXIT WHEN condición, se terminará el bucle cuando la condición se cumpla:
LOOP Sentencias EXIT WHEN condicion; Sentencias
END LOOP;
El bucle anterior es equivalente al siguiente:
LOOP Sentencias IF condicion THEN
EXIT; END IF; Sentencias
END LOOP;
Un tipo de bucle más común son los bucles condicionales:
WHILE condicion LOOP Sentencias END LOOP;
Y por último el bucle FOR:
FOR contador IN {REVERSE} limite_inferior..limite_superior LOOP sentencias END LOOP;
Contador deberá ser una variable de tipo numérico que sea capaz de contener los valores comprendidos entre limite_inferior y limite_superior. Limite_inferior y limite_superior deberán ser expresiones numéricas, ya sean constantes (1,10…) o funciones (ROUND(max,0), ASCII(‘A’)…)
Si la variable contador no está definida, PL/SQL definirá una variable de tipo INTEGER al iniciar el bucle, y la liberará al finalizar el bucle.