Recuperación de filas con un cursor

Db2 tiene un mecanismo llamado cursor. La utilización de un cursor es como mantener el dedo en una línea de texto determinada de una página impresa.

En Db2, un programa de aplicación utiliza un cursor para apuntar a una o más filas de un conjunto de filas que se recuperan de una tabla. También puede utilizar un cursor para recuperar filas de un conjunto de resultados que un procedimiento almacenado devuelve. El programa de aplicación puede utilizar un cursor para recuperar filas de una tabla.

Puede recuperar y procesar un conjunto de filas que cumpla la condición de búsqueda de una sentencia de SQL. Cuando utiliza un programa para seleccionar las filas, el programa procesa una o más filas a la vez.

La sentencia SELECT debe estar dentro de la sentencia DECLARE CURSOR y no puede incluir una cláusula INTO. La sentencia DECLARE CURSOR define y denomina el cursor, identificando el conjunto de filas que debe recuperarse con la sentencia SELECT del cursor. Se hace referencia a este conjunto de filas como la tabla de resultados.

Después de ejecutarse la sentencia DECLARE CURSOR, procese la tabla de resultados de un cursor del modo como se indica a continuación:

  1. Abra el cursor antes de recuperar ninguna fila.

    Para indicar a Db2 que está listo para procesar la primera fila de la tabla de resultados, haga que su programa emita la instrucción OPEN. Db2 y luego utiliza la instrucción SELECT dentro de la instrucción DECLARE CURSOR para identificar un conjunto de filas. Si utiliza variables del lenguaje principal en esa sentencia SELECT, Db2 utiliza el valor actual de las variables para seleccionar las filas.

  2. Utilice una sentencia FETCH para recuperar una o más filas.

    La manera más simple de que la sentencia FETCH recupere una única fila de la tabla de resultados es utilizando un cursor de ubicación de fila. En cualquier momento dado, un cursor de ubicación de fila recupera como máximo una única fila de la tabla de resultados en las variables de lenguaje principal. Puede utilizar una sentencia FETCH para recuperar más de una fila de la tabla de resultados utilizando un cursor habilitado para procesar conjuntos de filas. Un conjunto de filas es un conjunto de filas que se recupera mediante una captación de varias filas.

    Cuando su programa emite una instrucción FETCH posicionada en fila, Db2 utiliza el cursor para señalar una fila en la tabla de resultados, convirtiéndola en la fila actual. Db2 y, a continuación, mueve el contenido de la fila actual a las variables de host del programa que especificó en la cláusula INTO de la sentencia FETCH. La sentencia FETCH mueve el cursor. Puede utilizar matrices de variables de host y devolver varias filas de datos con una única sentencia FETCH.

  3. Cierre el cursor cuando se produzca la condición de fin de los datos.

    Si termina de procesar las filas de la tabla de resultados y desea volver a utilizar el cursor, emita una sentencia CLOSE para cerrar el cursor.

Recomendación : Cierre explícitamente el cursor cuando termine de utilizarlo.

El programa puede tener varios cursores. Cada cursor tiene los siguientes requisitos:

  • Una sentencia DECLARE CURSOR para definir el cursor
  • Sentencias OPEN y CLOSE para abrir y cerrar el cursor
  • Una sentencia FETCH para recuperar filas de la tabla de resultados del cursor

Debe declarar las variables de lenguaje principal antes de hacer referencia a ellas en una sentencia DECLARE CURSOR. Para definir e identificar un conjunto de filas a las que se debe acceder con un cursor, emita una sentencia DECLARE CURSOR. La sentencia DECLARE CURSOR nombra un cursor y especifica una sentencia SELECT. La sentencia SELECT define los criterios para las filas que pertenecen a la tabla de resultados.

Puede utilizar cursores para captar, actualizar o suprimir una o más filas de una tabla, pero no puede utilizarlos para insertar una fila en una tabla.

ejemplos

Suponga que el programa examina los datos sobre las personas del departamento D11 y guarda los datos en la tabla EMP. Los ejemplos siguientes muestran las sentencias de SQL que debe incluir en un programa COBOL para definir y utilizar un cursor. En estos ejemplos, el programa utiliza el cursor para procesar un conjunto de filas de la tabla EMP.

Iniciar la información de la interfaz de programación de uso general.
Ejemplo: definir el cursor
La sentencia siguiente define un cursor denominado THISEMP:
EXEC SQL
  DECLARE THISEMP CURSOR FOR
    SELECT EMPNO, LASTNAME,
    DEPT, JOB
    FROM EMP
    WHERE DEPT = 'D11'
  FOR UPDATE OF JOB
END-EXEC.
Ejemplo: abrir el cursor
La sentencia siguiente abre el cursor:
EXEC SQL
  OPEN THISEMP
END-EXEC.
Ejemplo: utilizar el cursor para recuperar una fila
La sentencia siguiente utiliza el cursor, THISEMP, para recuperar una fila:
EXEC SQL
  FETCH THISEMP
  INTO :EMP-NUM, :NAME2,
  :DEPT, :JOB-NAME
END-EXEC.
Ejemplo: Actualice la fila actual utilizando el cursor
La sentencia siguiente utiliza el cursor, THISEMP, para actualizar el valor de JOB para empleados específicos del departamento D11:
EXEC SQL
  UPDATE EMP
  SET JOB = :NEW-JOB
  WHERE CURRENT OF THISEMP
END-EXEC.                     
Ejemplo: cerrar el cursor
La sentencia siguiente cierra el cursor:
EXEC SQL
  CLOSE THISEMP
END-EXEC.

Más sobre los cursores

Finalizar la información de la interfaz de programación de uso general.

Si el cursor es sólo de avance, cada captación sitúa el cursor en la siguiente fila o conjunto de filas secuenciales. Un cursor con desplazamiento bidireccional puede desplazarse hacia adelante y hacia atrás y puede volverse a situar al principio, al final o en un punto de desplazamiento relativo. Las aplicaciones pueden utilizar un conjunto de sentencias de SQL muy útiles para captar datos utilizando un cursor en un orden aleatorio. Los cursores con desplazamiento bidireccional son especialmente útiles para aplicaciones basadas en pantallas. Puede especificar que los datos de la tabla de resultados deben permanecer estáticos. Por ejemplo, una aplicación de contabilidad puede necesitar que los datos permanezcan constantes, mientras que una aplicación de sistema de reservas de una línea aérea tiene que visualizar la información de disponibilidad de vuelos más reciente.

También puede definir opciones en la sentencia DECLARE CURSOR que especifiquen hasta qué punto un cursor con desplazamiento bidireccional es sensible a los cambios en los datos subyacentes cuando se producen inserciones, actualizaciones o supresiones.

  • Un cursor sensible es sensible a los cambios que se realizan en la base de datos después de generar la tabla de resultados. Por ejemplo, cuando una aplicación ejecuta sentencias UPDATE y DELETE ubicadas con el cursor, estos cambios se pueden ver en la tabla de resultados.
  • Un cursor insensible no es sensible a las inserciones, actualizaciones o supresiones que se realizan en las filas subyacentes de una tabla de resultados una vez creada ésta. Por ejemplo, el orden de las filas y los valores para cada fila de la tabla de resultados no cambian después de que la aplicación abra el cursor.

Para indicar que un cursor es de desplazamiento bidireccional, declárelo con la palabra clave SCROLL.

Iniciar la información de la interfaz de programación de uso general.Por ejemplo, el ejemplo siguiente muestra una declaración para un cursor desplazable no confidencial:
EXEC SQL DECLARE C1 INSENSITIVE SCROLL CURSOR FOR
  SELECT DEPTNO, DEPTNAME, MGRNO
  FROM DEPT
  ORDER BY DEPTNO
END-EXEC.

Para utilizar este cursor para captar la quinta fila de la tabla de resultados, puede utilizar una sentencia FETCH como la del ejemplo siguiente:

EXEC SQL FETCH ABSOLUTE +5 C1 INTO :HVDEPTNO, :DEPTNAME, :MGRNO;
Finalizar la información de la interfaz de programación de uso general.

Db2 for z/OS® proporciona otro tipo de cursor llamado cursor desplazable dinámico. Con un cursor con desplazamiento bidireccional dinámico, las aplicaciones pueden desplazarse directamente en una tabla base y a la vez acceder a los datos más actuales.