lunes, 27 de octubre de 2008

Cursores en Oracle

¿Que es un cursor?
Un cursor es una herramienta de sql que permite recorrer los resultados de una consulta y realizar operaciones. Seria un equivalente a leer la consulta con un CRecordSet( o el tipo de dato que use el lenguaje para manejar base de datos), cargar los datos en un array/File, recorrerlo y en cada vuelta realizar la accion.

Además de la sentencia, en oracle se necesita crear un record en el cual devuleve los datos del registro en el que esta parado. Importante, los campos del record y los de la sentencia de SQL tienen que estar en el mismo orden.

Ejemplo General:

DECLARE CURSOR [nombrecursor]IS
SELECT [campo(s)] FROM [tabla(s)] WHERE [condicion(es)];

TYPE [nombreRecord] IS RECORD
([nombrecampo1] [tabla1].[campo1]%type,
[nombrecampo2] [tabla1].[campo2]%type,
//...
[nombrecampon] [tabla1].[campon]%type);

[variable] [nombrerecord];

BEGIN

OPEN [nombrecursor];

//..

LOOP

Fetch [nombrecursor] into ;
Exit when [nombrecursor]%NOTFOUND;

//Realizo la operación

//..

END LOOP;

END;

El siguiente es un ejemplo donde se recorre la tabla productos y se le asigna como código administrativo el nombre del producto.
El diseño de la tabla de productos es el siguiente:

Productos
CódigoProducto: number
Nombre: varchar2[128]
CódigoAdministrativo: varchar2[128]

DECLARE CURSOR cursorProductos IS
SELECT CódigoProducto, Nombre FROM Productos;

TYPE recordProductos IS RECORD
(
CódigoProducto Productos.CódigoProducto %type,
Nombre Productos.Nombre %type);

recProductos recordProductos;

BEGIN

OPEN cursorProductos ;

LOOP

Fetch cursorProductos into recProductos;
Exit when cursorProductos %NOTFOUND;

UPDATE Productos SET CódigoAdministrativo = recProductos.Nombre
WHERE Productos.CódigoProducto = recProductos.Nombre

END LOOP;

END;

Evidentemente, el ejemplo anterior se podria haber resuelto con la siguiente sentencia:
UPDATE Productos SET CódigoAdministrativo = Nombre
Pero el objetivo de este, como todo ejemplo, solo sirve para mostrar la aplicación de una herramienta. Como último detalle aclaro que la instrucción [variable] [tabla].[campo]%type, declara una variable con el nombre [variable] del mismo tipo que el dato de
[tabla].[campo].
Espero sepan disculpar la falta de tabulado, pero todavía no me acostumbro a html.

No hay comentarios: