PL SQL
PL SQL
PL SQL
Oracle incorpora un gestor PL/SQL (basado en lenguaje ADA), incorpora todas las características de
lenguajes de tercera generación:
• Manejo de variables.
• Estructura modular (procedimientos y funciones).
• Estructuras de control (bifurcaciones, bucles y demás estructuras).
• Control de excepciones.
• Almacenamiento en la B.D. (para su posterior ejecución).
• Soporte para la programación orientada a objetos (POD).
• Ejemplo: [ DECLARE
< declaraciones > ]
BEGIN
< ordenes >
[ EXCEPTION
< gestión de excepciones > ]
END ;
La utilización de bloques supone una notable mejora de rendimiento, ya que se envían los bloques
completos al servidor para que sean procesados, en lugar de cada sentencia SQL. También se pueden anidar:
DECLARE
….
BEGIN
…...
DECLARE comienzo bloque interior (un DECLARE dentro de otro)
…..
BEGIN
…..
EXCEPTION
…..
END ;
….
EXCEPTION
…...
END
1
Las declaraciones de los datos deben hacerse en la sección de declaraciones:
Contador NUMBER2 ;
Nombre CHAR (20) ;
Nuevo VARCHAR2 (15) ;
BEGIN
…..
PL/SQL permite declarar una variable del mismo tipo que otra variable o que una columna de una tabla
mediante el atributo %TYPE.
También se puede declarar una variable para guardar una fila completa de una tabla mediante el atributo
%ROWTYPE.
IF <condición> THEN
instrucciones;
END IF;
IF <condición> THEN
instrucciones;
ELSE
instrucciones;
END IF;
IF <condición> THEN
instrucciones;
ELSIF <condicion2> THEN
instrucciones;
ELSIF <condicion3> THEN
instrucciones;
…..
ELSE
instrucciones;
END IF;
2
➢ Alternativa múltiple (CASE de comprobación)
Calcula el resultado de la expresión que sigue a la clausula CASE, a continuación comprueba si el
valor obtenido coincide con alguno d ellos valores especificados detrás de las clausulas WHEN,
en cuyo caso ejecutara la instrucción/es correspondientes, ELSE es opcional.
CASE [<expresión>]
WHEN <test1> THEN
<instrucciones1>;
WHEN <test2> THEN
<instrucciones2>;
WHEN <test3> THEN
<instrucciones3>;
[ELSE
<otras-instrucciones>;]
END CASE;
CASE
WHEN <condicion1> THEN
<instrucciones1>;
WHEN <condicion2> THEN
<instrucciones2>;
WHEN <condicion3> THEN
<instrucciones3>;
[ELSE
<otras-instrucciones>;]
END CASE;
➢ Mientras (WHILE)
Se evalúa la condición y si se cumple, se ejecutaran las instrucciones del bucle. El bucle se seguirá
ejecutando mientras se cumpla la condición, es una condición de continuación.
WHILE <condición>
LOOP
instrucciones;
END LOOP;
➢ Para (FOR)
3
Se utiliza cuando se conoce o se puede conocer el numero de veces que se debe ejecutar el bucle.
4
➢ Para (FOR) en incrementos negativos.
LOOP
instrucciones;
EXIT WHEN <condición>;
instrucciones;
END LOOP;
Ejemplos:
• DELETE FROM clientes WHERE nif = v_nif;
PL/SQL permite ejecutar cualquier consulta admitida por la base de datos. Pero cuando se ejecuta la consulta,
el resultado no se muestra automáticamente en el terminal del usuario, sino que se queda en un área de
memoria denominada cursor, a la que accederemos utilizando variables.
Utilizaremos una o mas variables (declaradas previamente) junto con la clausula INTO para poder acceder a
los datos devueltos por nuestra consulta (la consulta solo debe devolver una fila o dará error).
SELECT <columna/s> INTO <variable/s> FROM <tabla> WHERE …..];
5
Gestión de excepciones.
La sección EXCEPTION es la encargada de gestionar mediante los manejadores (WHEN) las excepciones
que puedan producirse durante la ejecución de un programa.
Cuando PL/SQL detecta una excepción, automáticamente pasa el control del programa a la sección
EXCEPTION del bloque PL/SQL.
Caso practico: Visualiza el apellido y el oficio del empleado con numero 7900
DECLARE
v_ape VARCHAR2 (10);
v_oficio VARCHAR2(10);
BEGIN
SELECT apellido, oficio INTO v_ape, v_oficio FROM EMPLEADOS WHERE EMP_NO = 7900 ;
DBMS_OUTPUT.PUT_LINE (v_ape || '*' || v_oficio) ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20000,'ERROR no hay datos');
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR (-20000,'ERROR demasiados datos');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20000,'ERROR en la aplicación');
END ;
/ si se pone al final el bloque se almacena en el bufer y luego se ejecuta
. si se pone al final el bloque se almacena en el bufer pero no se ejecuta hasta poner / o RUN.
El resultado es:
Función:
FUNCTION <nombrefuncion>
[( <lista de parámetros> )]
RETURN <tipo valor devuelto>
IS
[<declaración objetos locales>;]
BEGIN
<instrucciones>;
RETURN <expresión>;
[EXCEPTION
<excepciones>;]
END [<nombrefuncion>] ;
Oracle utiliza el paquete DBMS_OUTPUT con fines de depuración. Este incluye entre otros el procedimiento
PUT_LINE que permite visualizar textos en la pantalla (para que funcione correctamente la variable de
entorno SERVEROUTPUT deberá estar en ON).
7
✔ GET nombrefichero una vez cargado se ejecuta con RUN o /
➢ También se puede cargar y ejecutar con una sola orden con START o @:
✔ START nombre fichero
✔ @nombrefichero
8
Ejemplo:
CREATE OR REPLACE
PROCEDURE ver_depart [numdepart NUMBER]
AS
v_dnombre VARCHAR2(14);
v_localidad VARCHAR2(14);
BEGIN
SELECT dnombre, loc INTO v_dnombre, v_localidad
FROM depart
WHERE dept_no = numdepart;
DBMS_OUTPUT.PUT_LINE ('Num depart:' | | numdepart | | ' * Nombre dep:' | | v_dnombre | |
' * Localidad: ' | | v_localidad) ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('No encontrado departamento ') ;
END ver_depart ;
/
Para ejecutar este procedimiento creado se hace con EXECUTE nombre(dato), en modo terminal, ejemplo:
EXECUTE ver_depart(20); o BEGIN ver_depart(20) END ; en modo gráfico.
Colocar el símbolo & delante de una variable indica que se pedirá la introducción del dato especificado.
Pl/SQL dispone de los mismos datos que SQL ademas de otros propios, estos datos se pueden clasificar en:
➢ Escalares Almacenan valores simples
✔ Carácter/cadena:
• CHAR (L) Cadenas de caracteres de longitud fija, posiciones no usadas son blancos
• NCHAR (L) similar al anterior
• VARCHAR2 (L) Cadenas de caracteres de longitud variable
• NVARCHAR2 (L)
• LONG (L) Almacena cadenas de longitud variable, se debe especificar el máximo
• RAW (L) Almacena datos binarios de longitud fija
• LONG RAW (L) Almacena datos binarios de longitud variable
• ROWID Almacena identificadores de direcciones de fila
• UROWID (L) Almacena identificadores de direcciones de fila, especificando nº bytes
✔ Numérico
• NUMBER (P, E) Numérico, P numero total de dígitos, E numero decimales
• BINARY_INTEGER Numérico entero, se almacena en memoria en formato binario
• PLS_INTEGER Similar al anterior pero mas rápido/da error si desbordamiento
• BINARY_DOUBLE Para el ámbito científico con cálculos muy precisos y complejos
• BINARY_FLOAT Para el ámbito científico con cálculos muy precisos y complejos
✔ Boolean Almacena valores lógicos, TRUE, FALSE, NULL
✔ Fecha/hora
• DATE Almacena fechas incluyendo la hora
• TIMESTAMP Almacena fechas incluyendo la hora y fracciones de segundo
• INTERVAL Intervalo de tiempo entre fechas
✔ Otros
• ROWID
• UROWIN
9
➢ Compuestos compuestos de otros simples
✔ Tablas indexadas
✔ Tablas anidadas
✔ Varrays
✔ Objetos
➢ LOB almacenan objetos de grandes dimensiones (de hasta 128 terabytes, sustituyen a LONG RAW)
Los Identificadores se utilizan para nombrar los objetos que intervienen en un programa:
• Variables, constantes, cursores, excepciones, procedimientos, funciones, etiquetas....
• Pueden tener entre 1 y 30 caracteres de longitud
• El primer carácter ha de ser una letra
• El resto de caracteres han de ser alfanuméricos
• No pueden incluir signos de puntuación, espacios, etc.
• No se diferencia entre mayúsculas o minúsculas.
La opción DEFAULT o := sirve para asignar valores por defecto a la variable tras su creación.
Atributo %TYPE declara una variable del mismo tipo que otra (nombre_variable nombre_objeto%TYPE;)
Atributo %ROWTYPE declara una variable de registro cuyos campos se corresponden con las columnas de
una tabla (nombre_variable nombre_objeto%ROWTYPE;).
Las variables se crean al comienzo del bloque y dejan de existir una vez finalizada la ejecución del bloque
en que han sido declaradas, el ámbito de una variable incluye el bloque en el que se declara y sus bloques
hijos.
Las variables declaradas en los bloques hijos no son accesibles desde el bloque padre.
Los literales representan valores constantes directamente, se utilizan para visualizar valores.
Carácter 'A', 'a', '*'
Cadena 'Cliente Nº:'
Numérico 567, 2.23, -8.75
Booleano v_cobrado := TRUE;
Fecha/hora DATE '2005-11-09'
11
INSTRUCCIONES
- Los valores nulos en las expresiones siempre dan como resultado un valor nulo
12
13