BLOQUES ANÓNIMOS Y ESTRUCTURAS DE CONTROL

Dentro de la seccion DECLARE de un bloque anónimo podemos declarar funciones y procedimientos almacenados y ejecutarlos desde el bloque de ejecución del script.

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 dotras.

BucleExisten varias variantes de la estructura bucleLa más sencilla es la siguiente:

LOOsentenciaEND 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:

LOOSentenciaEXIT WHEN condicionSentencias

END LOOP;

El bucle anterior es equivalente al siguiente:

LOOSentenciaIF condicion THEN

EXITEND IFSentencias

END LOOP;

Un tipo de bucle más común son los bucles condicionales:

WHILE condicion LOOSentenciaEND 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.