Jorge Cárdenas
Introducción
En vez de ejecutar toda una consulta a
la vez, es posible crear un cursor que
encapsula la consulta y luego leer del
resultado de esta solo un poco de filas a
la vez
Evita sobrecarga de memoria
Los bucles FOR automáticamente crean un
cursor internamente
Una función puede devolver la referencia a
un cursor
Declarando variables tipo cursor
Dos maneras
Declarar la variable como tipo refcursor
Usar la sintaxis
Ejemplo
OPEN FOR EXECUTE
La variable cursor es abierta y la
consulta especificada es ejecutada
El cursor no puede estar abierto
previamente
La variable debe ser un cursor unbound
La consulta es especificada como String
(Igual que con EXECUTE)
Mismo significado para SCROLL y NO
SCROLL
OPEN FOR EXECUTE cont.
Sintaxis
Ejemplo
Abriendo un cursor bound
Abre una variable cursor en la que la
consulta ya se enlazo cuando fue
declarada
El cursor no puede estar abierto
previamente
Una lista de argumentos debe aparecer si
en la declaración se agrego parámetros
No hay como usar con EXECUTE
SCROLL y NO SCROLL no puede usarse
en OPEN, Los argumentos se pueden
especificar usando nombres o en orden
Abriendo un cursor bound cont.
Sintaxis
Ejemplo
Usando cursores
Una vez abierto el cursor, este puede ser
manipulado con las sentencias
FETCH, MOVE, UPDATE, DELETE WHERE
CURRENT OF, CLOSE
Estas manipulaciones no necesariamente
deben ocurrir en la misma función que
abre el curso (Siempre y cuando la función
devuelva un refcursor)
Un cursor esta disponible hasta el final de
una transacción
FETCH
Devuelve la siguiente fila del cursor en
la variable target, que puede ser una
variable tipo ROW o RECORD
Similar a SELECT INTO
Cuando no hay fila devuelve NULL
Se puede usar la variable FOUND
FETCH cont.
La clausula direction puede ser
cualquier variante permitida en SQL
FETCH
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
FORWARD o BACKWARD
FETCH cont.
Si direction es omitido usa por defecto
NEXT
Un cursor debe estar declarado con
SCROLL para permitir FETCH con los
comandos que se desplazan para atrás
El cursor debe ser un refcursor
CLOSE
Cierra un cursor abierto por dos razones
Para liberar recursos antes del fin de la
transacción
Liberar el cursor para volverlo a abrir
Sintaxis
Ejemplo
Tarea en Clase cont.
Crear una función que muestre usando
RAISE NOTICE los tres inmuebles mas
costosos (No usar bucles)
Debe declarar un cursor bound con la
consulta respectiva
Abrir el cursor
Usar FETCH la cual graba en una variable
tipo ROWTYPE
Devuelve VOID
Tarea en Clase cont.
Crear una función que permita devolver
el inmueble con mas habitaciones
usando un cursor
Debe declarar un cursor unbound
Abrir el cursor con la consulta respectiva
Usar FETCH FIRST FROM la cual graba en
una variable tipo RECORD y devolverla
Pasar por parámetros un rango de precio
de venta (Usando %TYPE) de los inmuebles
a incluir en la consulta
Tarea en Clase cont.
Crear una función que permita crear una
consulta dinámica mediante un cursor
Debe declarar un cursor unbound
Abrir el cursor con la consulta dinámica
respectiva mediante la función EXECUTE
format(‘’) junto con using ($1) o solo %L e
%I
○ Debe soportar una tabla, una columna, un
valor de la columna y una columna para
ordenar con ORDER BY DESC
Tarea en Clase cont.
Usar FETCH LAST FROM la cual graba en
una variable tipo RECORD y devolverla
Pasar por parámetros los campos
necesarios para la consulta dinámica como
text
Usar la consulta siguiente para probar sus
resultados
○ SELECT
cursorUnBoundInmuebleCasas('inmueble',
'direccion', 'Carcelen','precio_alquiler')