Página principal
Artículos y trucos
Catálogo de productos
Ejemplos y descargas
Mis libros
Cursos de formación
Investigación y desarrollo
Libros recomendados
Mis páginas favoritas
Acerca del autor
 
En colaboración con Amazon
 
Intuitive Sight

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.