La sentencia EGL get recupera un solo registro de archivo o fila de base de datos y proporciona una opción que permite sustituir o suprimir los datos almacenados más tarde en el código. Además, esta sentencia permite recuperar un conjunto de filas de base de datos y sustituir cada fila sucesiva en el siguiente registro SQL de una matriz dinámica.
La sentencia get se identifica a veces como get by key value y es distinta de otras sentencias que empiezan por la palabra get.
Si el recurso es recuperable (como en el caso de un archivo VSAM o una base de datos SQL o DL/I), la opción forUpdate bloquea el registro de forma que otros programas no puedan cambiarlo hasta que se produzca un compromiso. Encontrará los detalles sobre el proceso de compromiso en Unidad lógica de trabajo.
En una cláusula como esta (que está fuera de un bloque #sql{ }), no incluya un punto y coma antes del nombre de una variable de lenguaje principal.
Si no especifica una cláusula usingKeys, el componente de clave-valor de la sentencia implícita se basa en el componente de registro SQL al que se hace referencia en la sentencia get o es la base de la matriz dinámica a la que se hace referencia en la sentencia get.
En el caso de una matriz dinámica, los elementos de la cláusula usingKeys (o las variables de lenguaje principal del registro SQL) no deben estar en el registro SQL que es la base de la matriz dinámica.
La información de usingKeys se pasa por alto si especifica una sentencia SQL explícita.
emp.empnum = 1; // establece la clave en el registro emp try get emp forUpdate; onException myErrorHandler(8); // sale del programa end emp.empname = emp.empname + " Smith"; try replace emp; onException myErrorHandler(12); end
try get emp singleRow into empname with #sql{ select empname from Employee where empnum = :empnum }; onException myErrorHandler(8); end
try get emp forUpdate into empname with #sql{ select empname from Employee where empnum = :empnum }; onException myErrorHandler(8); // sale del programa end emp.empname = emp.empname + " Smith"; try replace emp; onException myErrorHandler(12); end
En el entorno CICS para MVS/ESA, la posición get se pierde cuando se emite una operación de compromiso o retrotracción, o a continuación de una sentencia converse si se ejecuta en modalidad segmentada.
Los detalles de la sentencia get dependen del tipo de registro. Para obtener detalles acerca del proceso DL/I, consulte el tema Registro DLISegment. Para obtener detalles acerca del proceso SQL, consulte el tema Registro SQL.
get myCustomer, myLocation, myOrder;EGL generará el siguiente código pseudo-DL/I a partir de esta sentencia:
GU STSCCST*D (STQCCNO = :myCust.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo) STPCORD
Si emite una sentencia get en un registro indexado, el valor de clave del registro determina qué registro se recupera del archivo.
Si el archivo es un archivo VSAM, la sentencia de EGL get (con la opción forUpdate) impide que otros programas cambien el registro. En los programas de proceso por lotes de z/OS, el bloqueo permanece hasta que se produce un compromiso, lo que podría no suceder hasta que finalice el paso del trabajo. En programas COBOL iSeries, el bloqueo permanece hasta que se produce un compromiso, que podría no suceder hasta el final de la unidad de ejecución, como se describe en Unidad de ejecución.
Cuando se lee un registro MQ en una cola de mensajes con la palabra clave get, EGL realiza automáticamente estas operaciones:
En IMS, una sentencia get 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 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 subsiguientes dan como resultado llamadas GN hasta que se alcanza una condición NRF (no se han encontrado registros en este nivel de segmento). La primera sentencia get después de NRF da como resultado otra llamada GU y el proceso continúa hasta que se alcanza una condición EOF. Cada llamada GU da como resultado un punto de compromiso automático.
Una sentencia get lee el registro situado a continuación del último registro leído de la secuencia de entrada. El primer registro se lee para la primera exploración de un archivo. Si el registro al que se accede en la operación de E/S anterior era el último registro del archivo, la sentencia get devuelve EOF.
El archivo se cierra y se reabre siempre que el programa cambia de adición a lectura o de lectura a adición. Cuando se cierra el archivo, la posición del archivo se pierde; por tanto, la primera sentencia get después de una sentencia add leerá el primer registro del archivo. De forma parecida, una sentencia add a continuación de una sentencia get o get next añadirá un registro al principio del archivo.
En el entorno zSeries por lotes, una sentencia get para un registro serie asignado a un archivo GSAM da como resultado una llamada get next (GN) a la base de datos de GSAM. Si un registro serie de longitud variable está en un archivo asociado con GSAM y la longitud del registro es superior a la del archivo físico, DL/I devuelve un código de estado en blanco. Los datos se truncan pero no se emite ningún mensaje, ya que la situación no puede detectarse.
La sentencia EGL get da como resultado una sentencia SQL SELECT en el código generado. Si especifica la opción singleRow, la sentencia SQL SELECT es una sentencia autónoma. La sentencia SQL SELECT también puede ser una cláusula de un cursor, como se describe en el apartado Soporte SQL.
Al especificar un registro SQL como objeto de E/S para la sentencia get, pero no especifica una sentencia SQL explícita, la sentencia SQL SELECT implícita tiene las siguientes características:
SELECT columna01, columna02, ... columnaNN FROM nombreTabla WHERE columnaClave01 = :elementoClave01 FOR UPDATE OF columna01, columna02, ... columnaNN
INTO :elementoRegistro01, :elementoRegistro02, ... :elementoRegistroNN
EGL deriva la cláusula SQL INTO si el registro SQL va acompañado de una sentencia SQL SELECT explícita cuando no se ha especificado una cláusula INTO. Los elementos de la cláusula INTO derivada son aquellos que están asociados con las columnas listadas en la cláusula SELECT de la sentencia SQL. (La asociación de elementos y columnas se encuentra en el componente de registro SQL, como se indica en el apartado Propiedades de elementos SQL). es necesaria una cláusula EGL INTO si no hay una columna asociada con un elemento.
columnaClave01 >= :elementoClave01 & columnaClave02 >= :elementoClave02 & . . . columnaClaveN >= :elementoClaveN
Conceptos relacionados
Soporte de bases de datos DL/I
Unidad lógica de trabajo
Tipos de registros y propiedades
Referencias a componentes
resultSetID
Soporte de SQL
Tareas relacionadas
Diagrama de sintaxis para sentencias y mandatos EGL
Consulta relacionada
Directiva #dli
add
close
Consideraciones relacionadas con CICS
delete
Sentencias EGL
Manejo de excepciones
execute
get next
get next inParent
get previous
Valores de error de E/S
open
prepare
replace
set
Propiedades de campo SQL
terminalID