Anda di halaman 1dari 21

Mg. Jorge Cárdenas

Mg. Jorge Cárdenas
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

Declarando variables tipo cursor  Dos maneras  Declarar la variable como tipo refcursor  Usar
  • 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

Declarando variables tipo cursor cont.  Si se especifican arguments, es una lista separada por comas
  • 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

OPEN FOR query cont.  Sintaxis  Ejemplo
  • Ejemplo

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

OPEN FOR EXECUTE cont.  Sintaxis  Ejemplo
  • Ejemplo

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

Abriendo un cursor bound cont.  Sintaxis  Ejemplo
  • Ejemplo

Abriendo un cursor bound cont.  Sintaxis  Ejemplo
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  Devuelve la siguiente fila del cursor en la variable target, que puede ser una

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

FETCH cont.  Si direction es omitido usa por defecto NEXT  Un cursor debe estar

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

  • CLOSE  Cierra un cursor abierto por dos razones  Para liberar recursos antes del fin
    CLOSE  Cierra un cursor abierto por dos razones  Para liberar recursos antes del fin

    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')