get next

La sentencia EGL get next lee el registro siguiente de un archivo o cola de mensajes, o la fila siguiente de una base de datos.

Diagrama de sintaxis para la sentencia get next
nombre de registro
Nombre del objeto de E/S; un DLISegment, un registro indexado, MQ, relativo, serie o SQL.
forUpdate
Opción que permite utilizar una sentencia EGL posterior para sustituir o suprimir los datos recuperados del archivo o base de datos.

Si el recurso es recuperable (como en el caso de una base de datos SQL), la opción forUpdate bloquea el registro de forma que otros programas no puedean cambiarlo hasta que se produzca un compromiso. Encontrará los detalles sobre el proceso de compromiso en Unidad lógica de trabajo.

usingPCB nombrePCB
Opción que permite especificar el nombre de un PCB, según lo definido en el registro PSB, para utilizarlo en lugar del PCB por omisión.
with #dli{ sentencia DLI }
Opción que permite una sentencia explícita DL/I GN o GHN, como se describe en la sección dedicada a la directiva #dli. No deje espacios entre #dli y el corchete de apertura.
from IDconjuntoResultados
Sólo para procesos SQL, un ID que conecta la sentencia get next con una sentencia open ejecutada antes en el mismo programa. Para obtener detalles, consulte el apartado resultSetID.
into
Inicia una cláusula EGL into, que lista los elementos que recibe valores de una tabla de base de datos relacional.
elemento
Un elemento que recibe el valor de una columna determinada. No especifique un signo de dos puntos (:) ante el nombre del elemento.

A continuación se ofrece un ejemplo de acceso a archivo:

  try
    open record1 forUpdate;
    onException
      myErrorHandler(8);
      return;
  end
  try
    get next record1; 
    onException
      myErrorHandler(12);
      return;
  end
  
  while (record1 not endOfFile)
    makeChanges(record1); // procesar el registro

    try
      replace record1; 
    onException 
      myErrorHandler(16); 
      return;
    end
    
    try
      get next record1; 
    onException
      myErrorHandler(12);
      return;
    end
  end // fin de while
  
  sysLib.commit();

Los detalles de la sentencia get next dependen del tipo de registro. Para obtener detalles acerca del proceso SQL, consulte el tema Proceso SQL.

Registro DLISegment

La sentencia get next genera una sentencia DL/I GN. La sentencia get next...forUpdate genera una sentencia DL/I GHN. Los usos principales de la sentencia get next son los siguientes:
  • Para leer un segmento a fin de realizar alguna acción con los datos de ese segmento, como por ejemplo imprimir un informe o una factura.
  • Para retener un segmento (en combinación con la opción forUpdate) a fin de utilizar las palabras clave EGL delete o replace para eliminar o actualizar un segmento. No es necesario ejecutar get next antes de utilizar add (añadir) en un registro, ya que el registro se añadirá en secuencia o según el valor del elemento de clave correspondiente a ese registro.

Registro indexado

Cuando una sentencia get next opera en un registro indexado, el resultado se basa en la posición actual del archivo, establecida mediante cualquiera de estas operaciones:
  • Una operación de entrada o salida (E/S) satisfactoria, como por ejemplo una sentencia get u otra sentencia get next; o
  • Una sentencia set en el formato set record position.
Las normas son las siguientes:
  • Si el archivo no está abierto, la sentencia get next lee un registro con el valor de clave más bajo del archivo.
  • Cada sentencia get next subsiguiente lee un registro cuyo valor de clave es el próximo más alto en relación a la posición actual del archivo. Más adelante se describe una excepción relativa a las claves duplicadas.
  • Una vez que una sentencia get next ha leído el registro con el valor de clave más alto del archivo, la siguiente sentencia get next provocará el valor de error de E/S endOfFile.
  • La posición actual del archivo resulta afectada por cualquiera de estas operaciones:
    • Una sentencia EGL set en el formato set record position establece una posición de archivo basada en el valor de set, que es el valor de clave del registro indexado al que la sentencia set hace referencia. La sentencia get next subsiguiente en el mismo registro indexado lee el registro de archivo cuyo valor de clave es igual o superior al valor de set. Si no existe tal registro, el resultado de la sentencia get next es endOfFile.
    • Una sentencia de E/S satisfactoria que no sea una sentencia get next establece una nueva posición de archivo y la sentencia get next subsiguiente emitida en el mismo registro EGL lee el siguiente registro del archivo. Una vez que una sentencia get previous ha leído un registro de archivo, por ejemplo, la sentencia get next lee el registro de archivo cuyo valor de clave es el siguiente más alto o devuelve endOfFile.
    • Si una sentencia get previous devuelve endOfFile, la sentencia get next subsiguiente recupera el primer registro del archivo.
    • Después de una sentencia get, get next o get previous no satisfactoria, la posición de archivo no está definida y debe volver a establecerse mediante una sentencia set en el formato set record position o mediante una operación de E/S que no sea una sentencia get next ni get previous.
  • Si utiliza un índice alternativo y en el archivo hay claves duplicadas, se aplican las siguientes normas:
    • La recuperación de un registro con una clave de valor más alto sólo se produce después de que una sentencia get next haya leído todos los registros que tienen la misma clave como registro recuperado más recientemente. El orden en el que se recuperan los registros con claves duplicadas es el orden en el que VSAM devuelve los registros.
    • Si una sentencia get next sigue a una operación de E/S satisfactoria que no sea una sentencia get next, la sentencia get next pasa por alto los registros con claves duplicadas y recupera el registro con la siguiente clave más alta.
    • El valor de error EGL duplicate no se establece si el programa recupera el último registro de un grupo de registros que contienen la misma clave.
Considere un archivo en el que las claves son las siguientes:
  1, 2, 2, 2, 3, 4

Cada una de las tablas siguientes ilustra el resultado de la ejecución de una secuencia de sentencias EGL en el mismo registro indexado.

Las dos tablas que siguen hacen referencia al código COBOL generado por EGL.

Sentencia EGL (por orden) Clave del registro indexado Clave del registro de archivo recuperada por la sentencia Valor de error EGL para COBOL
get 2 2 (la primera de tres) duplicate
get next cualquiera 3 --

Sentencia EGL (por orden) Clave del registro indexado Clave del registro de archivo recuperada por la sentencia Valor de error EGL para COBOL
set (en el formato set record position) 2 sin recuperación duplicate
get next cualquiera 2 (la primera de tres) duplicate
get next cualquiera 2 (la segunda) duplicate
get next cualquiera 2 (la tercera) --
get next cualquiera 3 --

Las dos tablas que siguen hacen referencia al código Java generado por EGL.

Sentencia EGL (por orden) Clave del registro indexado Clave del registro de archivo recuperada por la sentencia Valor de error EGL para Java
get 2 2 (la primera de tres) duplicate
get next cualquiera 2 (la segunda) duplicate
get next cualquiera 2 (la tercera) --
get next cualquiera 3 --

Sentencia EGL (por orden) Clave del registro indexado Clave del registro de archivo recuperada por la sentencia Valor de error EGL para Java
set (en el formato set record position) 2 sin recuperación duplicate
get next cualquiera 2 (la primera de tres) --
get next cualquiera 2 (la segunda) duplicate
get next cualquiera 2 (la tercera) --
get next cualquiera 3 --

Cola de mensajes

Cuando una sentencia get next opera en un registro MQ, el primer registro de la cola se lee en el registro MQ. Esta colocación se produce debido a que la sentencia get next invoca una o varias llamadas MQSeries:

Registro relativo

Cuando una sentencia get next opera en un registro relativo, el resultado se basa en la posición actual del archivo, establecida mediante una operación de entrada o salida (E/S) satisfactoria, como por ejemplo una sentencia get u otra sentencia get next. Las normas son las siguientes:
  • Si el archivo no está abierto, la sentencia get next lee el primer registro del archivo.
  • Cada sentencia get next subsiguiente lee un registro cuyo valor de clave es el próximo más alto en relación a la posición actual del archivo.
  • Una sentencia get next no devuelve noRecordFound si se suprime el registro siguiente. En lugar de ello, la sentencia get next pasa por alto los registros suprimidos y recupera el registro siguiente del archivo.
  • Una vez que una sentencia get next ha leído el registro con el valor de clave más alto del archivo, la siguiente sentencia get next provocará el valor de error EGL endOfFile.
  • La posición actual del archivo resulta afectada por cualquiera de estas operaciones:
    • Una sentencia de E/S satisfactoria que no sea una sentencia get next establece una nueva posición de archivo y la sentencia get next subsiguiente emitida en el mismo registro EGL lee el siguiente registro del archivo.
    • Después de una sentencia get, get next o get previous no satisfactoria, la posición de archivo no está definida y debe volver a establecerse mediante una sentencia set en el formato set record position o mediante una operación de E/S que no sea una sentencia get next.
  • Una vez que una sentencia get next ha leído el último registro del archivo, la siguiente sentencia get next provocará los valores de error EGL endOfFile y noRecordFound.

Registro serie

Cuando una sentencia get next opera en un registro serie, el resultado se basa en la posición actual del archivo, establecida mediante otra sentencia get next. Las normas son las siguientes:
  • Si el archivo no está abierto, la sentencia get next lee el primer registro del archivo.
  • Cada sentencia get next subsiguiente lee el registro siguiente.
  • Una vez que una sentencia get next ha leído el último registro, la sentencia get next subsiguiente provocará el valor de error EGL endOfFile.
  • Si el código generado añade un registro serie y luego emite el equivalente de una sentencia get next en el mismo archivo, EGL cierra y vuelve a abrir el archivo antes de ejecutar la sentencia get next. Por tanto, una sentencia get next que sigue a una sentencia add lee el primer registro del archivo. Este comportamiento también se produce cuando las sentencias get next y add se encuentran en programas diferentes, y un programa llama al otro. De forma parecida, una sentencia add a continuación de una sentencia get o get next añadirá un registro al principio del archivo.
Es aconsejable evitar que el mismo archivo esté abierto en más de un programa simultáneamente.

En CICS para z/OS, un solo programa no puede incluir una combinación de las sentencias add y get next para el mismo archivo de spool. Esta restricción también se aplica cuando las sentencias get next y add se encuentran en programas diferentes, y un programa llama al otro.

En IMS/VS, tenga en cuenta las siguientes consideraciones:
  • Un registro serie debe estar asociado con el PCB de E/S (PCB 0). La sentencia get next no está soportada para un programa de transacción ni para un programa por lotes al que se llama desde un programa de transacción. Los programas por lotes sólo pueden utilizar un archivo serie para la entrada. La cabecera del mensaje IMS (longitud, campo ZZ y código de transacción) se elimina automáticamente de cada registro leído de la cola.
  • Una sentencia get next para un registro serie asignado a una cola de mensajes de segmento único da como resultado una llamada get unique (GU) al PCB de E/S. Esta llamada GU da como resultado un punto de compromiso automático.
  • La primera sentencia get next para un registro serie asignado a una cola de mensajes de varios segmentos da como resultado una llamada GU al PCB de E/S. Las sentencias get next subsiguientes dan como resultado llamadas GN hasta que se alcanza una condición NRF (código de estado QD). La primera sentencia get next después de NRF da como resultado otra llamada GU y la función continúa hasta que se alcanza una condición EOF (código de estado QC). Cada llamada GU da como resultado un punto de compromiso automático.
  • Durante una planificación específica de un programa por lotes, el programa sólo puede ejecutar una sentencia get next desde una cola de mensajes. El código de transacción desde el que IMS ha planificado el programa determina la cola de mensajes que se lee. El recurso del sistema especificado durante la generación se pasa por alto.
En un BMP orientado a transacciones de IMS, una sentencia get next para un registro serie asignado a una cola de mensajes implica las mismas consideraciones que en IMS/VS.

Proceso SQL

Cuando una sentencia get next opera en un registro SQL, el código lee la fila siguiente de las seleccionadas por una sentencia open. Si emite una sentencia get next para recuperar una fila seleccionada mediante una sentencia open que tiene la opción forUpdate, puede realizar cualquiera de estas acciones:
  • Cambiar la fila con una sentencia EGL replace
  • Eliminar la fila con una sentencia EGL delete
  • Cambiar o eliminar la fila con una sentencia EGL execute

Una sentencia SQL FETCH representa la sentencia EGL get next en el código generado. El formato de la sentencia SQL generada no puede cambiarse, excepto para establecer la cláusula INTO.

Si emite una sentencia get next que intenta acceder a una fila que esté más allá de la última fila seleccionada, se aplican las sentencias siguientes:
  • No se copian datos del conjunto de resultados
  • EGL establece el registro SQL (si lo hay) en noRecordFound
  • Si la sentencia open relacionada incluía la opción scroll, el cursor permanece abierto con la posición del cursor inalterada. La opción scroll solo es válida si está generando salida en Java.
  • Si no ha establecido la opción, scroll, el cursor se cierra.

Finalmente, al especificar SQL COMMIT o sysLib.commit, el código conserva la posición en el cursor declarado en la sentencia open, pero sólo en caso de que utilice la opción hold en la sentencia open.

Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.