FETCH

FETCH — recuperar filas de una consulta utilizando un cursor

Synopsis

FETCH [ dirección ] [ FROM | IN ] nombre_cursor

donde dirección puede ser uno de:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE cantidad
    RELATIVE cantidad
    cantidad
    ALL
    FORWARD
    FORWARD cantidad
    FORWARD ALL
    BACKWARD
    BACKWARD cantidad
    BACKWARD ALL

Descripción

FETCH recupera filas utilizando un cursor previamente creado.

Un cursor tiene una posición asociada, la cual es utilizada por FETCH. La posición del cursor puede estar antes de la primera fila del resultado de la consulta, en cualquier fila particular del resultado, o después de la última fila del resultado. Al crearse, el cursor se posiciona antes de la primera fila. Después de recuperar algunas filas, el cursor se posiciona en la fila recuperada más recientemente. Si FETCH supera el final de las filas disponibles, el cursor se queda posicionado después de la última fila, o antes de la primera fila si se está recuperando hacia atrás. FETCH ALL o FETCH BACKWARD ALL siempre dejarán el cursor posicionado después de la última fila o antes de la primera fila.

Las formas NEXT, PRIOR, FIRST, LAST, ABSOLUTE y RELATIVE recuperan una sola fila después de mover el cursor adecuadamente. Si no existe tal fila, se devuelve un resultado vacío y el cursor queda posicionado antes de la primera fila o después de la última fila, según corresponda.

Las formas que utilizan FORWARD y BACKWARD recuperan el número indicado de filas moviéndose en dirección hacia adelante o hacia atrás, dejando el cursor posicionado en la última fila devuelta (o después/antes de todas las filas, si la cantidad supera el número de filas disponibles).

RELATIVE 0, FORWARD 0 y BACKWARD 0 solicitan recuperar la fila actual sin mover el cursor, es decir, volver a recuperar la fila recuperada más recientemente. Esto tendrá éxito a menos que el cursor esté posicionado antes de la primera fila o después de la última fila, en cuyo caso no se devuelve ninguna fila.

Note

Esta página describe el uso de cursores a nivel de comandos SQL. Si estás intentando usar cursores dentro de una función de PL/pgSQL, las reglas son diferentes — consulta la Section 41.7.3.

Parámetros

dirección

dirección define la dirección de recuperación y el número de filas a recuperar. Puede ser uno de los siguientes:

NEXT

Recupera la siguiente fila. Este es el comportamiento por omisión si se omite la dirección.

PRIOR

Recupera la fila anterior.

FIRST

Recupera la primera fila de la consulta (equivalente a ABSOLUTE 1).

LAST

Recupera la última fila de la consulta (equivalente a ABSOLUTE -1).

ABSOLUTE cantidad

Recupera la fila número cantidad de la consulta, o la fila número abs(cantidad) desde el final si la cantidad es negativa. Se posiciona antes de la primera fila o después de la última fila si la cantidad está fuera de rango; en particular, ABSOLUTE 0 se posiciona antes de la primera fila.

RELATIVE cantidad

Recupera la fila número cantidad siguiente, o la fila número abs(cantidad) anterior si la cantidad es negativa. RELATIVE 0 vuelve a recuperar la fila actual, si la hay.

cantidad

Recupera las siguientes cantidad filas (equivalente a FORWARD cantidad).

ALL

Recupera todas las filas restantes (equivalente a FORWARD ALL).

FORWARD

Recupera la siguiente fila (equivalente a NEXT).

FORWARD cantidad

Recupera las siguientes cantidad filas. FORWARD 0 vuelve a recuperar la fila actual.

FORWARD ALL

Recupera todas las filas restantes.

BACKWARD

Recupera la fila anterior (equivalente a PRIOR).

BACKWARD cantidad

Recupera las cantidad filas anteriores (escaneando hacia atrás). BACKWARD 0 vuelve a recuperar la fila actual.

BACKWARD ALL

Recupera todas las filas anteriores (escaneando hacia atrás).

cantidad

cantidad es una constante entera posiblemente con signo, que determina la ubicación o el número de filas a recuperar. Para los casos de FORWARD y BACKWARD, especificar una cantidad negativa equivale a cambiar el sentido de FORWARD y BACKWARD.

nombre_cursor

El nombre de un cursor abierto.

Salidas

Al completarse con éxito, un comando FETCH devuelve una etiqueta de comando de la forma

FETCH cantidad

La cantidad es el número de filas recuperadas (posiblemente cero). Ten en cuenta que en psql, la etiqueta de comando no se mostrará realmente, ya que psql muestra en su lugar las filas recuperadas.

Notas

El cursor debe declararse con la opción SCROLL si se tiene la intención de utilizar cualquier variante de FETCH que no sea FETCH NEXT o FETCH FORWARD con una cantidad positiva. Para consultas simples, PostgreSQL permitirá la recuperación hacia atrás desde cursores no declarados con SCROLL, pero es mejor no confiar en este comportamiento. Si el cursor se declara con NO SCROLL, no se permiten recuperaciones hacia atrás.

Las recuperaciones con ABSOLUTE no son más rápidas que navegar a la fila deseada con un movimiento relativo: la implementación subyacente debe recorrer todas las filas intermedias de todos modos. Las recuperaciones absolutas negativas son aún peores: la consulta debe leerse hasta el final para encontrar la última fila y luego recorrerse hacia atrás desde allí. Sin embargo, rebobinar al inicio de la consulta (como con FETCH ABSOLUTE 0) es rápido.

Se utiliza DECLARE para definir un cursor. Usa MOVE para cambiar la posición del cursor sin recuperar datos.

Ejemplos

El siguiente ejemplo recorre una tabla utilizando un cursor:

BEGIN WORK;

-- Configurar un cursor:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- Recuperar las primeras 5 filas en el cursor liahona:
FETCH FORWARD 5 FROM liahona;

 code  |          title          | did | date_prod  |   kind   |  len
-------+-------------------------+-----+------------+----------+-------
 BL101 | The Third Man           | 101 | 1949-12-23 | Drama    | 01:44
 BL102 | The African Queen       | 101 | 1951-08-11 | Romantic | 01:43
 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
 P_301 | Vertigo                 | 103 | 1958-11-14 | Action   | 02:08
 P_302 | Becket                  | 103 | 1964-02-03 | Drama    | 02:28

-- Recuperar la fila anterior:
FETCH PRIOR FROM liahona;

 code  |  title  | did | date_prod  |  kind  |  len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- Cerrar el cursor y terminar la transacción:
CLOSE liahona;
COMMIT WORK;

Compatibilidad

El estándar SQL define FETCH únicamente para su uso en SQL embebido. La variante de FETCH descrita aquí devuelve los datos como si fueran el resultado de un SELECT en lugar de colocarlos en variables de host. A excepción de este punto, FETCH es totalmente compatible hacia arriba con el estándar SQL.

Las formas de FETCH que involucran FORWARD y BACKWARD, así como las formas FETCH cantidad y FETCH ALL, en las cuales FORWARD es implícito, son extensiones de PostgreSQL.

El estándar SQL permite únicamente FROM antes del nombre del cursor; la opción de usar IN, o de omitirlos por completo, es una extensión.

Véase también

CLOSE, DECLARE, MOVE