Anda di halaman 1dari 21

Mg.

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

 FOR puede ser reemplazado por IS (Igual que en


Oracle)
 Si SCROLL es especificado el cursor es capaz de
desplazarse para atrás, Si NO SCROLL es
especificado el cursor no puede hacerlo, Si esta en
blanco es permitido desplazarse para atrás
Declarando variables tipo cursor
cont.
 Si se especifican arguments, es una
lista separada por comas de pares
nombre tipo_dato

 Con refcursor se puede utilizarse el


cursor para cualquier consulta
(unbound)
Abriendo cursores
 Todo cursor debe ser abierto antes de
ser usado
 Equivalente al comando DECLARE
CURSOR en SQL
 Tres formas para abrir usando la
sentencia OPEN
 Dos usan cursores unbound
 La tercera usa un cursor bound (con
consulta)
OPEN FOR query
 La variable cursor es abierto y se le da
una consulta especifica a ser ejecutada
 El cursor no puede estar abierto
previamente
 Tiene que ser declarado como un cursor
unbound (refcursor)
 Query debe ser un SELECT o algo que
devuelva filas (EXPLAIN)
 Mismo significado para SCROLL y NO
SCROLL
OPEN FOR query cont.
 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')

Anda mungkin juga menyukai