domingo, 15 de agosto de 2021

SELECT ... FOR UPDATE

cláusula FOR UPDATE

Es una cláusula no estándar que posee Oracle y que permite bloquear las filas que aparecen en una instrucción SELECT de modo que esta instrucción genera una transacción (si no estuviéramos ya en una). La razón es que nadie pueda modificar esas filas a fin de trabajar sin problemas con ellas.


Esta cláusula se coloca antes de la cláusula ORDER BY. Ejemplo:


SELECT cif, nombre, localidad, direccion  FROM empresas

WHERE provincia=’Palencia’

FOR UPDATE;


Por supuesto sólo podemos bloquear filas que otros usuarios no estén bloqueando. Y, puesto que esta instrucción en realidad es de tipo DML, para finalizar el bloqueo deberemos finalizar la transacción (con ROLLBACK o COMMIT).


Podemos especificar que se bloquee sólo una o más columnas:


SELECT cif, nombre, localidad, direccion  FROM empresas

WHERE provincia=’Palencia’

FOR UPDATE OF direccion;

En el código anterior se bloquea solo la columna dirección.


Incluso podemos indicar un tiempo máximo de bloqueo:


SELECT cif, nombre, localidad, direccion  FROM empresas

WHERE provincia=’Palencia’

FOR UPDATE WAIT 10; 

--Bloquea las filas durante 10 segundos


[11.1.2]consultas con ROWNUM


La función ROWNUM devuelve el número de la fila de una consulta. Por ejemplo en:


SELECT ROWNUM, edad, nombre FROM clientes

Aparece el número de cada fila en la posición de la tabla. Esa función actualiza sus valores usando subconsultas. De modo que la consulta:


SELECT ROWNUM AS ranking, edad, nombre 

FROM (

   SELECT edad, nombre FROM clientes ORDER BY edad DESC

);


Puesto que:


SELECT edad, nombre FROM clientes ORDER BY edad DESC;


obtiene una lista de los clientes ordenada por edad, el SELECT superior obtendrá esa lista pero mostrando el orden de las filas en esa consulta. Eso permite hacer consultas de tipo top-n, (los n más....).


Por ejemplo para sacar el top-10 de la edad de los clientes (los 10 clientes más mayores)´, haríamos:


SELECT ROWNUM AS ranking, edad, nombre FROM clientes

FROM (

SELECT edad, nombre FROM clientes ORDER BY edad DESC

)

WHERE ROWNUM<=10;


[11.1.3]consultas sobre estructuras jerárquicas


Imaginemos una tabla de empleados definida por un código de empleado, nombre del mismo y el código del jefe. Este último código está relacionado con el código de empleado que posee el jefe en cuestión. Así definido, una consulta que muestre el nombre de un empleado y el nombre de su jefe directo, sería:


SELECT e.nombre AS empleado, j.nombre AS jefe 

FROM empleados e

JOIN  empleados j ON (e.cod_jefe=j.cod_empleado);

......


Fuentes.

Artículo:  "[11] Consultas Avanzadas" Publicado en https://jorgesanchez.net/ . Consultado el 05/08/2021.

URL: https://jorgesanchez.net/manuales/sql/select-avanzadas-sql2016.html

No hay comentarios:

Publicar un comentario