INF520 BD II Unidad - 2
INF520 BD II Unidad - 2
INF520 BD II Unidad - 2
programación en Base
UNIDAD de Datos (PL/SQL)
II
Contenido Temático
• 2.1. Introducción y Fundamentos del Lenguaje de programación en BD.
2.2. Actualización de datos avanzada a partir Subconsultas.
2.3. Más allá de las tablas: Gestión de objetos del Schema.
2.4. Estructuras selectivas y control de secuencia.
2.5. Estructuras repetitivas y procesamiento iterativo.
2.1. INTRODUCCIÓN Y FUNDAMENTOS DEL LENGUAJE
DE PROGRAMACIÓN EN BD.
[ declare | is | as ]
/*Parte declarativa*/
begin
/*Parte de ejecucion*/
[ exception ]
/*Parte de excepciones*/
end;
INTRODUCCIÓN A LA PROGRAMACIÓN PLSQL
DECLARE
/*Parte declarativa*/
nombre_variable DATE;
BEGIN
/*Parte de ejecución /
SELECT SYSDATE INTO nombre_variable
FROM DUAL;
EXCEPTION
/*Parte de excepciones*/
WHEN OTHERS THEN
dbms_output.put_line('Se ha producido un error’);
END;
PUESTA EN MARCHA DE CÓDIGO PLSQL
FUNDAMENTOS DE PLSQL
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
• PL/SQL es un lenguaje estructurado con bloques. Un bloque PL/SQL es definido por las
palabras clave DECLARE, BEGIN, EXCEPTION, y END, que dividen el bloque en tres secciones
• PL/SQL es una extensión procedural de SQL. Está integrado en el núcleo del RDBMS ORACLE.
Un bloque PL/SQL anónimo consta de 3 secciones
[DECLARE]
-- Definición de variables, constantes, cursores, ...
BEGIN
-- Cuerpo
[EXCEPTION]
-- Excepciones
END;
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
BEGIN
DBMS_OUTPUT.put_line('¡Hola Mundo!');
END;
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
• Ejecutando bloques PL/SQL
Una vez que hemos escrito un bloque de código PL/SQL éste se puede ejecutar. Existen muchas
herramientas para ejecutar código PL/SQL. La más básica es SQL*Plus, una interfaz de línea de
comandos para ejecutar sentencias SQL así como bloques PL/SQL. La Figura 1 muestra un ejemplo de
ejecución del más simple de los bloques de ejemplo de nuestro “¡Hola Mundo!” en SQL*Plus y en SQL
Developer
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
• El siguiente bloque declara una variable de tipo VARCHAR2 (un string) con un largo máximo de
100 bytes para contener el string ‘¡Hola Mundo!’. Después, el procedimiento
DBMS_OUTPUT.PUT_LINE acepta la variable, en lugar del literal, para desplegarlo:
DECLARE
l_mensaje VARCHAR2(100) := '¡Hola Mundo!’;
BEGIN
DBMS_OUTPUT.put_line(l_mensaje);
END;
• Note que he llamado a la variable l_mensaje. Normalmente uso el prefijo l_ para variables
locales —variables definidas dentro del código de un bloque— y el prefijo g_ para variables
globales definidas en un paquete.
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
Construyendo bloques de programas PL/SQL – (TYPE & ROWTYPE)
• El siguiente bloque declaramos 2 variables del tipo de la columna de la tabla employees, insertamos
los valores del empleado cuyo id es 138, y lo imprimimos por pantalla.
DECLARE
l_last_name employees.last_name%TYPE;
l_first_name employees.first_name%TYPE;
BEGIN
SELECT last_name, first_name
INTO l_last_name, l_first_name
FROM employees
WHERE employee_id = 138;
DBMS_OUTPUT.put_line (
'Mr. ' || l_last_name ||', '|| l_first_name);
END;
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
Construyendo bloques de programas PL/SQL - (TYPE & ROWTYPE)
• El siguiente bloque declaramos 1 variable del tipo de todos los campos de la tabla employee, luego
insertamos todos los valores de la empleado cuyo id es 138, y lo imprimimos por pantalla.
DECLARE
l_employee employees%ROWTYPE;
BEGIN
SELECT a.*
INTO l_employee
FROM employees a
WHERE employee_id = 138;
DBMS_OUTPUT.put_line (
l_employee.last_name ||' '|| l_employee.first_name ||' '|| l_employee.phone_number ||' '||
l_employee.job_id ||' '|| l_employee.salary);
END;
PUESTA EN MARCHA DE CÓDIGO PLSQL
& FUNDAMENTOS DE PLSQL
DECLARE
l_mensaje VARCHAR2(100) := '¡Hola Mundo!’;
BEGIN
DBMS_OUTPUT.put_line(l_mensaje);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;
2.2. ACTUALIZACIÓN DE DATOS AVANZADA A PARTIR
SUBCONSULTAS
ACTUALIZACIÓN DE DATOS AVANZADA A PARTIR SUBCONSULTAS
La instrucción UPDATE nos permite actualizar los valores de los campos de una tabla,
para uno o varios registros, o incluso para todos los registros de una tabla.
Su sintaxis general es:
UPDATE NombreTabla
SET Campo1 = Valor1, ..., CampoN = ValorN
WHERE Condición
Siendo:
• NombreTabla: el nombre de la tabla en la que vamos a actualizar los datos.
• SET: indica los campos que se van a actualizar y con qué valores lo vamos a hacer.
• WHERE: Selecciona los registros de la tabla que se van a actualizar. Se puede
aplicar todo lo visto para esta cláusula anteriormente, incluidas las sub-consultas.
ACTUALIZACIÓN DE DATOS AVANZADA A PARTIR SUBCONSULTAS
Ejemplos:
1.- Corrige el apellido del empleado con identificador 5. El correcto es
"Smith":
UPDATE Employees
SET LastName = 'Smith'
WHERE EmployeeID = 5
Nótese como en este caso al carecer de una cláusula WHERE que restrinja la
actualización se actualizan todos los registros.
Es muy importante incluir una cláusula WHERE en las instrucciones UPDATE salvo
en casos muy concretos como el del ejemplo anterior. De no hacerlo se
actualizarán todos los registros de la tabla como acabamos de ver. Es habitual
que, por error, se omita esta cláusula y se pierdan datos de forma
irreversible (salvo que dispongamos de copias de seguridad o tengamos la
posibilidad de hacer un ROLLBACK (cancelación de las instrucciones) si no hemos
finalizado la transacción).
ACTUALIZACIÓN DE DATOS AVANZADA A PARTIR SUBCONSULTAS
Podemos incluir una o varias subconsultas dentro una sentencia UPDATE. Éstas pueden estar contenidas en
la cláusula WHERE o formar parte también de la cláusula SET. En este último caso se deben seleccionar el
mismo número de campos y con los tipos de datos apropiados, para que cada uno de los valores pueda
ser almacenado en la columna que hay a la izquierda del signo igual “=”, entre paréntesis, al lado de la
instrucción SET.
Veamos unos ejemplos:
1.- Para todos los productos de la categoría bebidas ('beverages'), de la cual no conocemos su
identificador, duplica su precio:
UPDATE Products
SET UnitPrice = UnitPrice * 2
WHERE CategoryID = (SELECT CategoryID FROM Categories WHERE CategoryName = 'Beverages')
Noten como hemos utilizado una subconsulta en el filtro de modo que se averigua el identificador de la
categoría que nos interesa, a partir de su nombre.
2.- Asignar a todos los productos de la categoría bebidas ('beverages'), el mismo precio que tiene el
producto con número de identificador (clave primaria) igual a 5:
UPDATE Products
SET UnitPrice = (SELECT UnitPrice FROM Products WHERE ProductID = 5)
WHERE CategoryID = (SELECT CategoryID FROM Categories WHERE CategoryName = 'Beverages')
ACTUALIZACIÓN DE DATOS AVANZADA A PARTIR SUBCONSULTAS
De la misma forma podemos actualizar tablas realizando eliminación de registros mediante DELETE
siguiendo la siguiente sintaxis básica para realizar eliminaciones con subconsulta:
DELETE FROM tabla
WHERE campo OPERADOR (SUBCONSULTA);
EJEMPLO: Eliminamos todos los libros de las editoriales que tiene publicados libros de "Juan Perez":
DELETE FROM libros
WHERE codigoeditorial in
(SELECT e.codigo
FROM editoriales e
JOIN libros
ON codigoeditorial=e.codigo
WHERE autor='Juan Perez');
La subconsulta es una combinación que retorna una lista de valores que la consulta externa emplea
al seleccionar los registros para la eliminación.
2.3. MÁS ALLÁ DE LAS TABLAS: GESTIÓN DE OBJETOS
DEL SCHEMA
Esquema: Es una coleccion de objetos logicos utilizados para organizar de manera mas comprensible la
informacion.
Usuarios: Es el nombre y clave de la cuenta del esquema.
Tablas: Es una unidad logica basicamente de almancenamiento que esta compuesta por filas y columnas, y se
identifica con un nombre.
Vistas: Es una seleccion de varias columnas, regularmente de diferentes tablas. Una vista no almacena datos,
solo las presenta de forma dinamica. Se utilizan para simplificar la vision del usuario sobre un conjunto de
tablas, hacienda transparente la forma de obtencion de los datos.
Indices: Es una estructura creada para ayudar a recuperar datos de una manera mas rapida y eficiente. Un
indice se crea sobre una o varias columnas de una tabla. De manera que cuando se disponga recuperar data,
esta sea obtenida de una manera mas rapida.
Secuencias: El generador de secuencias de ORACLE se utiliza para generar numeros unicos llamados secuencias.
MAS ALLA DE LAS TABLAS: GESTIÓN DE OBJETOS DEL ESQUEMA.
• Procedimientos: Es un grupo de sentencias SQL escritas en PL/SQL, donde se implementan una serie de
rutinas con el proposito de completar una o varias tareas.
• Funciones: Es un grupo de sentencias SQL escritas en PL/SQL, donde se implementan una serie de rutinas que
devuelven un valor.
• Disparadores Triggers: Es un procedimiento que se ejecuta en forma inmediata cuando ocurre un evento
especial. Estos eventos solo pueden ser la insercion, actualizacion o eliminacion de datos de una tabla.
• Vistas Materializadas: es una vista que aparte de guardar la estructura de la seleccion, tambien guarda la
data que obtiene esta estructura realizando una carga inicial, y luego cada cierto tiempo va refrescando los
mismos.
2.4 ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA.
-ESTRUCTURAS DE CONTROL DE FLUJO-.
• Estructura condicional IF
Sentencias GOTO
IF (expresión) THEN
-- Instrucciones
ELSIF (expresión) THEN
-- Instrucciones
ELSE
-- Instrucciones
END IF;
-ESTRUCTURAS DE CONTROL DE FLUJO-
DECLARE
flag NUMBER;
BEGIN
flag :=1 ;
IF (flag = 1) THEN
GOTO paso2;
END IF;
<<paso1>>
dbms_output.put_line('Ejecución de paso 1’);
<<paso2>>
dbms_output.put_line('Ejecución de paso 2');
END;
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
Mas abajo mostramos las estructuras selectivas, de control y repetición que ofrece Oracle para
PLSQL:
• Estructuras de control de flujo: IF & GOTO.
• BUCLES
DECLARE
num1 NUMBER := &get_num;
BEGIN
IF num1 < 0 THEN
DBMS_OUTPUT.PUT_LINE ('The number '||num1||' is a
negative number');
ELSIF num1 = 0 THEN
DBMS_OUTPUT.PUT_LINE ('The number '||num1||' is equal
to zero');
ELSE
DBMS_OUTPUT.PUT_LINE ('The number '||num1||' is a
positive number');
END IF;
END;
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
EJEMPLO
DECLARE
flag NUMBER;
BEGIN
flag :=1 ;
IF (flag = 1) THEN
GOTO paso2;
END IF;
<<paso1>>
dbms_output.put_line('Ejecucion de paso 1');
<<paso2>>
dbms_output.put_line('Ejecucion de paso 2');
END;
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
CASE
La instrucción CASE puede evaluar múltiples expresiones y devolver para cada una de
ellas un valor/bloque de instrucciones. El resultado de cada WHEN puede ser un valor
o una sentencia, en el primer caso el resultado de una sentencia CASE se puede
guardar en una variable.
Su sintaxis:
CASE variable
WHEN expresión1 THEN valor1/bloque de instrucciones
WHEN expresión2 THEN valor2/bloque de instrucciones
WHEN expresión3 THEN valor3/bloque de instrucciones
WHEN expresión4 THEN valor4/bloque de instrucciones
ELSE valor5/bloque de instrucciones
END
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
CASE
Ejemplo: Dada la siguiente tabla de Empleados, realizar una consulta con la
sentencia CASE.
Nombre EC
SELECT Nombre, CASE EC Juan S
WHEN 'C' THEN 'Casado/a' Maria C
El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con
instrucción EXIT. Su sintaxis es la siguiente
LOOP
-- Instrucciones
IF (expresion) THEN
-- Instrucciones
EXIT;
END IF;
END LOOP;
ESTRUCTURAS REPETITIVAS Y PROCESAMIENTO
ITERATIVO.
-ESTRUCTURAS DE CONTROL DE FLUJO-
• LOOP
LOOP
-- Instrucciones
IF (expresión) THEN
-- Instrucciones
EXIT;
END IF;
END LOOP;
• WHILE
WHILE (expresion)
LOOP
-- Instrucciones
END LOOP;
• FOR
FOR contador IN [REVERSE] inicio..final
LOOP
-- Instrucciones
END LOOP;
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final.
-- Instrucciones
END LOOP;
EJEMPLO de LOOP
DECLARE
a NUMBER:=1;
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(to_char(a));
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END;
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
EJEMPLO de WHILE
DECLARE
i NUMBER := 1;
i_cubed NUMBER;
BEGIN
WHILE i <= 10 LOOP
i_cubed := i**3;
DBMS_OUTPUT.PUT_LINE('Number: ' || TO_CHAR(i) || ' Cube: '
|| TO_CHAR(i_cubed));
i := i + 1;
END LOOP;
END;
ESTRUCTURAS SELECTIVAS Y CONTROL DE SECUENCIA
DECLARE
EJEMPLO de FOR v_min number(3);
v_max number(3);
v_c number(1);
BEGIN
SELECT MIN(employee_id), MAX(employee_id) into v_min, v_max
FROM employees;
IF v_c = 0 THEN
dbms_output.put_line(i);
END IF;
END LOOP;
END;
•Manejo de
PROXIMO
Excepciones y
UNIDAD III Tipos de Datos