Actualización y selección en Oracle
Este truco está muy relacionado con Actualiza, pero también selecciona, un truco que publiqué hace poco, en el que explicaba cómo SQL Server permite utilizar la misma instrucción update para recuperar en variables de memoria el valor de un campo de una fila modificada:
create procedure ProximoCodigo @cod integer output as
update CONTADORES
set @cod = Proximo, Proximo = Proximo + 1
En aquel momento no lo sabía, pero Oracle permite hacer algo similar, cambiando la sintaxis, como es de suponer. He aquí un ejemplo extraído de una aplicación "real":
update COMPANY
set NextOrder = NextOrder + 1
where CompanyID = 1
returning NextOrder into aOrderNo;
La sintaxis es más elegante, por ser más explícita, que la utilizada por SQL Server. Como antes, la instrucción solamente debe actualizar una fila, como máximo; si quisiéramos quedarnos con valores pertenecientes a varias filas, tendríamos que utilizar la cláusula bulk collect into en vez de un simple into. En la cláusula returning podemos mencionar cuantas expresiones deseemos, separándolas entre sí mediante comas. En la cláusula into debemos incluir tantas variables como expresiones haya en returning. ¡Ah!, y los valores devueltos corresponden al estado en que se queda la fila después de ejecutar las asignaciones contenidas en set.
Pero aquí no terminan las sorpresas. También es posible utilizar returning en las instrucciones delete e insert. En un borrado, por ejemplo, nos sirve para saber qué valores tenían ciertas columnas del registro que acabamos de eliminar:
delete from EMPLEADOS
where EmpID = aEmpID
returning Nombre, Apellidos into aName, aSurname;
Creo innecesario añadir que el uso de returning mejora la velocidad de procesamiento y ahorra tráfico, tanto en la red como en el bus del disco duro.
|