FETCH — recuperar filas de una consulta utilizando un cursor
FETCH [dirección] [ FROM | IN ]nombre_cursordondedirecciónpuede ser uno de: NEXT PRIOR FIRST LAST ABSOLUTEcantidadRELATIVEcantidadcantidadALL FORWARD FORWARDcantidadFORWARD ALL BACKWARD BACKWARDcantidadBACKWARD ALL
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.
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.
direccióndirecció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.
PRIORRecupera 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( desde
el final si la cantidad)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( anterior
si la cantidad)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 ALLRecupera 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 ALLRecupera todas las filas anteriores (escaneando hacia atrás).
cantidadcantidad 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_cursorEl nombre de un cursor abierto.
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.
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.
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;
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 y cantidadFETCH
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.