Lenguaje PL/SQL.

Hasta ahora hemos interrogado a las bbdd utilizando sentencias SQL propias del lenguaje de base de datos. Sin embargo hay cierto tipos de acciones que no se pueden desarrollar ya que se necesitaría un cierto lenguaje de programación específico. De esa necesidad surgió el lenguaje procedimental PL/SQL diseñado por ORACLE y exclusivo de ORACLE.

El lenguaje procedimental PL/SQL (Procedural Language/Structure Query Language), es un lenguaje que no soporta ordenes de definición de datos (DDL), ni control de datos (DCL), pero soportará:

● El uso de variables.
● Estructuras de control de flujo y toma de decisiones.
● Control de excepciones.
● Reutilización de código a través de paquetes, procedimientos o funciones.

Entonces podremos escribir procedimientos y funciones o scripts para ciertas tareas en nuestra base de datos.

El código desarrollado en PL/SQL se puede almacenar en objetos de la bbdd, creando procedimientos o funciones, pudiendo además ser reutilizables para otros scripts. Dicho código se ejecuta en el servidor.

El código más básico PL/SQL está formado por la siguiente estructura:

[DECLARE]
-- variables, cursores, excepciones, etc.
BEGIN    -- sentencias SQL
   -- sentencias de control PL/SQL.
[EXCEPTION]
   -- acciones si se produce un error.
END;

El único bloque obligatorio para crear un PL/SQL tiene que contener las palabras claves BEGIN y END; (con el punto y coma final).

En el apartado DECLARE se declaran todas las variables, constantes y excepciones definidas por el usuario.

Entre las palabras BEGIN...END; se introducen las sentencias de control PL/SQL de los lenguajes de programación. Las sentencias más habituales van a ser:

Secuencias. Ordenes, llamadas a funciones o procedimientos en orden descendiente y con ; al final de cada una.
Alternas. Son secuencias o bloques que se ejecutarán evaluando una expresión y redirigiendo el flujo del programa a una línea en cuestión.
Bucles. bloques repetitivos un determinado número de veces mientras no se cumpla una condición.

Tipos de datos.

Los tipos de datos que manejaremos en el sistema son datos que el lenguaje SQL soporte. Al igual que en otro lenguaje, existirán variables, constantes, funciones, bloques, etc., que podrán acumular instrucciones independientes de la secuencia principal. Las variables, por ejemplo, guardarán un valor que puede ser cambiado a lo largo de la vida del programa, mientras que las constantes mantendrán su valor fijo. Como los tipos de datos, dependen del lenguaje y del SGBD utilizado, podemos establecer que los tipos de datos más usados son:

NUMBER.
Este tipo es numérico. Almacena números enteros o de coma flotante de cualquier longitud.

number(5,5) -- almacena número de 5 dígitos y 5 posiciones decimales.

CHAR.
Este tipo almacena un carácter. Por defecto el valor de su longitud es 1, aunque puede almacenar datos con una longitud máxima de 32767.

VARCHAR2.
Almacena variables alfanuméricas empleando solo la cantidad imprescindible del valor ocupado por el contenido de la misma.

BOOLEAN.
El tipo es un valor lógico que se emplea para almacenar valores TRUE o FALSE.

DATE.
sirve para almacenar datos de tipo fecha. Internamente se almacena como tipos numéricos y es posible realizar operaciones matemáticas con estos tipos.

ATRIBUTOS DE TIPO.
Existen dos atributos de tipos. El atributo %TYPE, que permite conocer el tipo de una variable, constante o campo de la base de datos; %ROWTYPE, que permite obtener todos los tipos de los campos de una tabla de la base de datos. También existe el atributo PL/SQL que nos permite crear tipos personalizados (registros) y colecciones (tablas PL/SQL).

Una vez establecidos los tipops de datos que puedes utilizar nos queda saber como crear y declarar variables que usen dicho tipo de datos. En PL/SQL utilizamos la palabra DECLARE antes de entrar en el bloque BEGIN-END; Al utilizar DECLARE el sistema reserva un espacio de memoria para la acumulación de dicho valor. También tienes la posibilidad de inicializar la variable (darle un valor).

La sintaxis para la declaración es la siguiente:

Identificador [Varible/contante] tipo_dato [NOT NULL] [:= | DEFAULT | Expresión];

Por ejemplo:

--Declaramos variable y no inicializo
hoy DATE;
--Declaramos variable e inicializamos
edad(2) NOT NULL := 14;
--Declaramos una constante y la inicializamos
pi CONSTANT NUMBER :=3.1415;

Ten en cuenta que la asignación se hace con el operador := (walrus en Python). Además las constantes son obligatorias que se asignen valor en su declaración.

PL/SQL permite también asignar valores declarados desde consultas como por ejemplo:

select sum(precio*unidades) into facturado from pedidos;

Operadores y expresiones.

Al igual que en los lenguajes de programación existen operadores para realizar operaciones con consultas. PL/SQL permite utilizar los mismos operadores que SQL. A continuación te muestro la lista de los operadores PL/SQL:

Operadores en PL/SQL

Aunque PL/SQL no está pensado para el usuario final, a veces es conveniente que el sistema te permita mostrar lo que se está haciendo por pantalla, o poder asignar valores a las variables desde un terminal. De ahí que hablemos de entradas y salidas para la depuración.

La salida.
Hay que activar la variable serveroutput de la siguiente manera:

set serveroutput on

Una vez activada podemos escribir por pantalla utilizando la sintaxis siguiente:

dbms_output.put_line("Saludos!");

Si queremos mostrar una variable en cuestión, solo hay que poner su nombre:

dbms_output.put_line(pi);

En la mayoría de los casos podemos utilizar los operadores de la anterior tabla, sobre todo para mostrar más información u objetos del script.

dbms_output.put_line("Saludos!" || nombreCliente);

La entrada.
Para leer valores pasados por teclado hay que hacer una asignación a una variable y poner el símbolo & seguido de una cadena de caracteres que se mostrará al pedir la información.

set serveroutput on
declare
altura int;
base int;
begin
 altura:=&Introduce_el_valor_de_la_altura;
base :=&Introduce_el_valor_de_la_base;
dbms_output.put_line('Un triangulo de: '||base||' y altura' ||altura||' tiene un area de :'||base*altura/2);
end;
/

Observa que cuando escribimos un texto para solicitar un dato, dicho texto no debe de tener ningún espacio en blanco. Además observas como he utilizado el símbolo "/". Con este símbolo indico al programa que se ejecute.

Estructura de control.

Según el teorema de la programación estructurada toda función de un programa debe implementarse en cualquier lenguaje de programación que combine tres estructuras lógicas como:

Secuencia: Ejecución de una instrucción tras otra.
Selección: Ejecución de una o más instrucciones, según el valor de la variable.
Iteracción: ejecución de una instrucción mientras el valor de la variable referenciada sea verdadero.

Hasta ahora hemos visto la selección, pues hemos visto como declarar objetos en PL/SQL. Vamos a ver los siguientes.

Selección.
Para este bloque generalmente se usan condicionales. Veamos los diferentes condicionales que nos proporciona PL/SQL.

La sentencia IF.

Obviamente es un condicional que evalua una expresión en función del valor recibido de la variable, constante, objeto, etc., etc. Su sintaxis es:

IF condicion THEN
instrucciones;
[ELSIF condición THEN
instrucciones;]
[ELSE
instrucciones;]
END IF;

Si has estudiado otros cursos de esta web, podrás comprobar que el código es muy simple. El bloque IF-ELSIF evaluará la condición si es verdadera en cualquier situación de IF o ELSIF. Y el bloque ELSE evaluará el caso que no sea verdadera la situación.

Por ejemplo, si vivimos en Matrix:

begin
usuario:=&Vive_dentro_de_Matrix(S/N)?;
if usuario='S' then
dbms_output.put_line('Matrix has his');
else
dbms_output.put_line('Esta fuera de Matrix');
end if;
end;
/

Al ser un condicional, podemos seguir añadiendo condiciones con el bloque ELSIF.

La sentencia CASE.

Es similar al switch de C# y evalúa la condición hasta que encuentre alguna que se cumpla. Su sintaxis es:

CASE [expresión]
WHEN {condición|valor1} THEN
bloque_instrucciones_1
WHEN {condición|valor2} THEN
bloque_instrucciones_2
....
ELSE
Bloque_instrucciones_defecto
END CASE;

Aquí el juego es mucho mayor en comparación con el bloque anterior, ya que podemos escribir tantas condiciones como queramos comprobar. Por ejemplo podemos establecer varios rangos de respuestas para las notas de un alumno.

Como cualquier condicional, si ninguna de las opciones es correcta, se evaluará un resultado False y ejecutará el bloque ELSE.

Iteración.
Son bucles que repiten una iteracción hasta dar con una condición establecida en el LOOP. Hay tres tipos de bloques repetitivos:

● Bucle básico LOOP. Acciones repetitivas sin condiciones globales.
● Bucle FOR. Acciones repetitivas basadas en un contador.
● Bucle While. Acción repetitiva que se basa en una condición.

--Bucle LOOP.
LOOP
instrucciones;
END LOOP;

Este sería el más básico de todos. Al no tener ningún tipo de condición ni final, se repetiría indefinidamente hasta cerrar el programa. No es habitual hacer un bucle infinito, sino es recomendable poner una condición para que se pare dicho bloque.

set serveroutput on
declare
n int :=0;
loop
n := n + 1;
exit when n>100;
end loop;

-- Bucle WHILE.
WHILE condición LOOP
instrucciones;
.......
END LOOP;

Hay que tener un especial cuidado en crear bien la condición a evaluar, ya que si ponemos la condición a False, puede que se ejecute el bucle de forma infinita.

--Bucle FOR.
FOR índice IN [REVERSE] valor_inicial.. valor_final LOOP
instrucciones;
...
END LOOP;

Este bucle es el más complejo (o intuitivo según se mire), ya que tiene un valor que inicializa el bucle y un valor que lo termina. Por ejemplo en el script sacamos los primeros 100 números de forma incremental:

set serveroutput on
begin
for i in 0 .. 100 LOOP
dbms_output.put_line(i);
end loop;
end;
/

Además si utilizas la opción reverse después de la claúsula IN, obtendrás la cuenta en forma descendiente (100 a 0).

Más adelante seguiremos con esto del lenguaje PL/SQL y hablaremos sobre los procedimientos y funciones, a la par que disparadores (triggers)y cursores. Sin olvidarnos de mirar las excepciones, pero eso será en próximas clases.

Os dejo un vídeo sobre el cual aprenderás bien los conceptos que hemos repasado en esta clase.

Comparte y ayuda a que siga creciendo mirpas.com. Gracias.