Modulo 4
Modulo 4
SQL avanzado
Video de inmersión
La tendencia es que las bases de datos asuman un papel cada vez más importante en la
arquitectura general del procesamiento de datos. Así es que el DBMS asumió más
responsabilidad, lo cual le proporcionó un control más centralizado y redujo la posibilidad
de corrupción de datos originados a partir de errores de programación de las
aplicaciones. Tres características han sido parte de esta tendencia: procedimientos
almacenados, funciones y disparadores.
Las funciones son programas SQL almacenados que devuelven un solo valor para cada
fila de datos. A diferencia de los procedimientos almacenados, las funciones se invocan
haciendo referencia a ellas en sentencias SQL en casi cualquier cláusula en la que se
pueda utilizar un nombre de columna. Esto los hace ideales para realizar cálculos y
transformaciones de datos en los datos que se muestran en los resultados de la consulta
o utilizados en las condiciones de búsqueda. Casi todos los productos DBMS
relacionales vienen con un conjunto de funciones suministradas por el proveedor para
uso general y, por lo tanto, las funciones añadidas por los usuarios de la base de datos
local, a menudo, se denominan “funciones definidas por el usuario”.
Los disparadores se utilizan para invocar automáticamente la capacidad de
procesamiento de un procedimiento almacenado en función de las condiciones que
surgen dentro de la base de datos. Por ejemplo, un disparador puede transferir fondos
automáticamente de una cuenta de ahorros a una cuenta corriente si la cuenta corriente
se convierte en sobregiro.
Ejecución condicional: una estructura IF... THEN ... ELSE permite un uso de un
procedimiento SQL para probar una condición y llevar a cabo diferentes
operaciones, dependiendo del resultado.
Bucle: un ciclo WHILE o FOR o una estructura similar permite realizar una
secuencia de operaciones SQL repetidamente hasta que se cumpla alguna
condición de terminación. Algunas implementaciones proporcionan una estructura
de bucle especial con base en cursor para procesar cada fila de resultados de
consulta.
Estructura de bloques: una secuencia de sentencias SQL puede agruparse en un
solo bloque y utilizarse en otras construcciones de flujo de control como si el
bloque de instrucciones fuera una sola sentencia.
Agregar una fila a la tabla de cliente que contiene los datos del cliente.
Con un procedimiento almacenado, todo este trabajo se puede integrar en una única
rutina SQL definida.
Nombre
As
new_target number(16,2);
Begin
Credit_Limit)
Values
Update Salesreps
Update Offices
Commit;
End; Fin
Parámetros:
Entrada [IN];
Salida [OUT];
Entrada-salida [IN-OUT].
Los nombres de los parámetros pueden aparecer dentro del cuerpo del procedimiento,
dondequiera que pueda aparecer una constante. Cuando aparece un nombre de
parámetro, el DBMS utiliza su valor actual.
Además de los parámetros de entrada, algunos lenguajes SPL también admiten
parámetros de salida. Esto permite que un procedimiento almacenado devuelva valores
que calcula durante su ejecución. Los parámetros de salida proporcionan una capacidad
importante para pasar información de un procedimiento almacenado a otro
procedimiento almacenado que lo llama, y también puede ser útil para depurar
procedimientos almacenados utilizando SQL interactivo.
Algunos lenguajes SPL admiten parámetros que funcionan como parámetros de entrada
y salida. En este caso, el parámetro pasa un valor al procedimiento almacenado y
cualquier cambio en el valor durante la ejecución del procedimiento se refleja en el
procedimiento de llamada.
Variables
Se declaran al principio del cuerpo del procedimiento, justo después del encabezado del
procedimiento y antes de la lista de sentencias SQL. Los tipos de datos de las variables
pueden ser cualquiera de los tipos de datos SQL soportados como tipos de datos de
columna por el DBMS.
Las variables locales dentro de un procedimiento almacenado pueden utilizarse como
fuente de datos dentro de las expresiones SQL en cualquier lugar en que pueda
aparecer una constante. El valor actual de la variable se utiliza en la ejecución de la
sentencia. Además, las variables locales pueden ser destinos para datos derivados de
expresiones o consultas SQL.
Llamando a un procedimiento almacenado
Una vez definido por la instrucción CREATE PROCEDURE, el procedimiento se puede
utilizar. Un programa de aplicación puede solicitar la ejecución del procedimiento
almacenado si utiliza la instrucción SQL adecuada. Otro procedimiento almacenado
puede llamar para realizar una función específica. El procedimiento almacenado también
se puede invocar a través de una interfaz interactiva de SQL.
Llama al procedimiento almacenado y le pasa los seis valores especificados como sus parámetros. El
DBMS ejecuta el procedimiento almacenado y lleva a cabo cada sentencia SQL en la definición del
procedimiento una por una. Si el procedimiento ADD_CUST completa su ejecución con éxito, se ha llevado
a cabo una transacción confirmada dentro del DBMS. Si no, el código de error devuelto y el mensaje indican
EXECUTE ADD_CUST ('XYZ orden, en una lista que está encerrada entre
103,'Chicago');
Corporation', c_num = 2137, cred_lim = 30000.00, mediante los parámetros nombrados, en cuyo
c_offc = 'Chicago', c_rep = 103, tgt_sales = caso, los valores de parámetro se pueden
Funciones
Además de los procedimientos almacenados, la mayoría de los lenguajes SPL soportan
funciones almacenadas. La diferencia es que una función devuelve una sola cosa (como
un valor de datos, un objeto o un documento XML) cada vez que se invoca, mientras
que un procedimiento almacenado puede devolver muchas cosas o nada. El soporte
para los valores devueltos varía según el lenguaje SPL. Las funciones se utilizan,
comúnmente, como expresiones de columna en sentencias SELECT y, por lo tanto, se
invocan una vez por fila en el conjunto de resultados, lo cual permite que la función
realice cálculos, conversión de datos y otros procesos para producir el valor devuelto
para la columna. A continuación, se muestra un ejemplo sencillo de una función
almacenada.
/* Return total order amount for a customer */ create function get_tot_ords(c_num in number) return number
as
begin
from orders
end;
A medida que el DBMS evalúa la condición de búsqueda para cada fila de resultados de
la consulta, utiliza el número de cliente de la fila candidata actual (CUST_NUM) como un
argumento a la función GET_TOT_ ORDS y comprueba si supera el umbral de $ 10 000.
Esta misma consulta podría expresarse como una consulta agrupada, con la tabla
ORDERS también incluida en la cláusula FROM y los resultados agrupados por el
cliente y el vendedor. En muchas implementaciones, el DBMS lleva a cabo la consulta
agrupada más eficientemente que la precedente, lo que, probablemente, obliga al DBMS
a procesar la tabla de pedidos una vez para cada cliente.
1. El programa construye una sentencia SQL como una cadena de texto en una de
sus áreas de datos y la almacena en la memoria como una variable con nombre.
La sentencia puede ser casi cualquier sentencia SQL que no recupera datos.
Cursores
Una necesidad común para la repetición de sentencias dentro de un procedimiento
almacenado surge cuando el procedimiento ejecuta una consulta y necesita procesar los
resultados de la consulta, fila por fila. Todos los lenguajes principales proporcionan una
estructura para este tipo de procesamiento. Conceptualmente, las estructuras son
paralelas a las instrucciones DECLARE CURSOR, OPEN CURSOR, FETCH y CLOSE
CURSOR en SQL incorporado o en las llamadas de la API SQL correspondientes. Sin
embargo, en lugar de buscar los resultados de la consulta en el programa de aplicación,
en este caso, se están obteniendo en el procedimiento almacenado, que se ejecuta
dentro del propio DBMS. En lugar de recuperar los resultados de la consulta en variables
de programa de aplicación (variables de host), el procedimiento almacenado los
recupera en variables de procedimiento almacenadas locales. Para ilustrar esta
capacidad, asumimos que deseamos rellenar dos tablas con datos de la tabla ORDERS.
Una tabla, llamada BIGORDERS, debe contener el nombre del cliente y el tamaño del
pedido para cualquier pedido de más de $ 10 000. La otra, SMALLORDERS, debe
contener el nombre del vendedor y el tamaño de la orden para cualquier orden inferior a
$ 1 000. La mejor y más eficiente manera de hacerlo sería utilizar dos sentencias SQL
INSERT independientes con subconsultas, pero con fines de ilustración, consideraremos
el siguiente método en su lugar:
1. Ejecutar una consulta para recuperar el importe de la orden, el nombre del cliente y
el nombre del vendedor para cada pedido.
4. Repetir los pasos 2 y 3 hasta que se agoten todas las filas de los resultados de la
consulta.
select amount, company, name from orders, customers, salesreps where cust = cust_num
begin
loop
/* Check for big orders and handle */ elsif (curs_row.amount > 10000.00) then insert into bigorders
La consulta descrita por el cursor se realiza, en realidad, mediante el bucle FOR con
base en el cursor. Básicamente, le dice al DBMS que realice la consulta descrita por el
cursor (equivalente a la instrucción OPEN en SQL incorporado) antes de iniciar el
procesamiento de bucle. El DBMS, entonces, ejecuta el bucle FOR repetidamente,
busca una fila de resultados de consulta en la parte superior del bucle, coloca los
valores de columna en la variable CURS_ROW y luego ejecuta las instrucciones en el
cuerpo del bucle. Cuando no se busquen más filas de resultados de consulta, el cursor
se cierra y el procesamiento continúa después del bucle.
Disparadores
A diferencia de los procedimientos almacenados, un disparador no se activa mediante
una instrucción CALL o EXECUTE, sino que se asocia con una tabla de base de datos.
Cuando los datos de la tabla cambian por una instrucción INSERT, DELETE o UPDATE,
se lanza el disparador, lo que significa que el DBMS ejecuta las instrucciones SQL que
forman el cuerpo del disparador. Algunas marcas de DBMS permiten la definición de
actualizaciones específicas que provocan un disparo, y algunas de estas marcas,
especialmente Oracle, permiten que los disparadores tengan base en eventos del
sistema, como los usuarios que se conectan a la base de datos o la ejecución de un
comando de apagado de la base de datos.
Los disparadores se pueden utilizar para provocar actualizaciones automáticas de la
información dentro de una base de datos. Por ejemplo, supongamos que deseamos
configurar la base de datos para que cada vez que se inserte un nuevo vendedor en la
tabla SALESREPS, el objetivo de ventas de la oficina donde trabaja el vendedor se
actualice por la cuota del nuevo vendedor. A continuación, les presentamos un
disparador de Oracle PL/SQL que logra este objetivo:
El cuerpo de este disparador le dice al DBMS que, para cada nueva fila insertada en la
tabla, debería ejecutar la instrucción UPDATE especificada para la tabla OFFICES. El
valor QUOTA de la fila SALESREPS recién insertada se denomina NEW.QUOTA dentro
del cuerpo del disparador.
Pregunta de repaso
¿Las funciones y los procedimientos almacenados difieren solo en
la cantidad de parámetros?
Verdadero
Falso
Justificación
Before update
create Disparador bef_upd_ord before update on orders
begin
Cuando se escribe una instrucción SQL interactiva que causa un error, el programa de
SQL interactivo muestra un mensaje de error, anula la instrucción y solicita que se
escriba una nueva instrucción.
Tipos de errores
Errores en tiempo de compilación: las comillas mal colocadas, las palabras clave
de SQL mal escritas y los errores similares en sentencias de SQL embebido son
detectados por el precompilador de SQL e informados al programador.
Un valor SQLCODE negativo indica un error grave que impidió que la instrucción
se ejecutara correctamente. Por ejemplo, un intento de actualizar una vista de solo
lectura produciría un valor SQLCODE negativo.
Se puede decir que la aparición del término NoSQL aparece con la llegada de la
web 2.0, ya que, hasta ese momento, solo subían contenido a la red aquellas
empresas que tenían un portal, pero con la llegada de aplicaciones como
Facebook, Twitter o YouTube, cualquier usuario podía subir contenido, esto
provocó un crecimiento exponencial de los datos. (Acens, 2014, p. 2)
Es en este momento cuando empiezan a aparecer los primeros problemas de la gestión
de toda esa información almacenada en bases de datos relacionales. En un principio,
para solucionar estos problemas de accesibilidad, las empresas optaban por utilizar un
mayor número de máquinas, pero pronto se dieron cuenta de que esto no solucionaba el
problema, además de que resultaba ser una solución muy cara.
La otra solución era la creación de sistemas pensados para un uso específico
que, con el paso del tiempo, han dado lugar a soluciones robustas, de esta
manera apareció el movimiento NoSQL. Por lo tanto, hablar de bases de datos
NoSQL es hablar de estructuras que nos permiten almacenar información en
aquellas situaciones en las que las bases de datos relacionales generan ciertos
problemas debido, principalmente, a problemas de escalabilidad y rendimiento de
las bases de datos relacionales, donde se encuentran miles de usuarios
concurrentes y con millones de consultas diarias. Además de lo comentado
anteriormente, las bases de datos NoSQL son sistemas de almacenamiento de
información que no cumplen con el esquema entidad–relación. Tampoco utilizan
una estructura de datos en forma de tabla donde se van almacenando los datos,
sino que para el almacenamiento hacen uso de otros formatos como clave–valor,
mapeo de columnas o grafos. (Acens, 2014, p. 2)
use peliculas;
db.peliculas.find();
show dbs;
Desventajas
La atomicidad de las No todas las bases de datos
operaciones juega un NoSQL contemplan la
papel crucial en el atomicidad de las instrucciones
rendimiento de las bases y la integridad de los datos.
de datos. Soportan lo que se llama
Tiene una escalabilidad, “consistencia eventual”.
que aunque probada en Existen problemas de
muchos entornos compatibilidad entre
productivos, suele, por instrucciones SQL. Las nuevas
norma, ser inferior a las bases de datos utilizan sus
bases de datos NoSQL. propias características en el
lenguaje de consulta y no son
100 % compatibles con el SQL
de las bases de datos
relacionales. El soporte a
problemas con las queries de
trabajo en una base de datos
NoSQL es más complicado.
Falta de estandarización. Hay
muchas bases de datos NoSQL
y aún no hay un estándar, como
sí lo hay en las bases de datos
relacionales. Se presume un
futuro incierto en estas bases
de datos.
Soporte multiplataforma. Aún
quedan muchas mejoras en
algunos sistemas para que
soporten sistemas operativos
que no sean Linux.
Suelen tener herramientas de
administración no muy usables
o se accede por consola.
Cuando los datos deben ser consistentes sin dar posibilidad al error de utilizar una
base de datos relacional, SQL.
Pregunta de repaso
¿Cuáles de las siguientes son tipos de bases de datos NoSQL?
Clave-valor
Dibujadas
Documentales
Grafo
Pictóricas
Justificación
Video de habilidades
Dos de las siguientes son características de las bases NoSQL:
Escalabilidad
Atomicidad
Inseguridad
Justificación
Dos de las siguientes son características de las bases SQL:
Confiabilidad.
Escalabilidad.
Integridad/Consistencia.
Velocidad.
Justificación
Verdadero.
Falso.
Justificación
Relacionales.
SiSQL.
Documentales.
Grafo.
Justificación
Escrituras.
Actualización.
Eliminación.
Lecturas.
Justificación
Microactividades
Para realizar los ejercicios, recordemos leer el Manual de uso de PostgreSQL:
Introducción
Si utilizamos pgAdmin, todas las tablas, datos, funciones, procedimientos almacenados
y triggers, serán guardados en tu computadora. De esta forma, podremos acceder a
ellos, indiferentemente si cerramos el programa o reiniciamos el sistema.
Situación
En el recorrido de todos los ejercicios vamos a tener que crear y trabajar sobre un
sistema para una universidad.
Desde la universidad Puls-ar te solicitan llevar el registro de los alumnos y las materias
que ellos cursan. Cuando los alumnos se inscriben se les pide su DNI, nombre, apellido
y e-mail.
Dados de alta en la universidad, ellos ya están en condiciones de anotarse a las
materias disponibles, teniendo en cuenta que las materias tienen un nombre y un año de
cursado.
Requerimientos
Utilización de la plataforma de PostgreSQL.
Enunciados
Ejercicio 4.1
Ejercicio 4.2
Tabla 5. Cantidad/inscriptos
Ejercicio 4.3
Creemos una tabla que se llame alumnos_logs. Ídem para alumnos, pero agregando un
campo que se llame fecha para registrar un tipo de datos de fecha y hora. Esta tabla, a
su vez, no debe tener un identificador único. La utilidad de esta tabla será definida más
adelante para poder registrar los cambios realizados sobre los alumnos.
Ejercicio 4.4
Creemos un procedimiento almacenado que luego deberá utilizarse para llamar desde
un trigger. La idea de este procedimiento almacenado es registrar las modificaciones
ocurridas sobre la tabla alumnos cuando sus registros se actualicen. Deberemos
guardar estas modificaciones dentro de la nueva tabla alumnos_logs. El procedimiento
almacenado debe llamarse alumnos_update_trigger_fnc().
Ejercicio 4.5
Ejercicio 4.6
Recordemos que la columna fecha tendrá otros valores, porque se registrará la fecha y
hora del momento en que ejecuten las actualizaciones.
Tabla 6. Datos
Ejemplo de resolución
Glosario
Referencias
Acens. (2014). Bases de datos NoSQL. Qué son y tipos que nos podemos encontrar.
https://www.acens.com/wp-content/images/2014/02/bbdd-nosql-wp-acens.pdf
PandoraFMS. (2015). NoSQL vs. SQL: principales diferencias y cuándo elegir cada una
de ellas. https://pandorafms.com/blog/es/nosql-vs-sql-diferencias-y-cuando-elegir-cada-
una/