open

La sentencia EGL open selecciona un conjunto de filas de una base de datos relacional para recuperarlo posteriormente mediante sentencias get next. La sentencia open puede operar sobre un cursor o sobre un procedimiento al que se llama.


Diagrama de sintaxis de la sentencia open, sin registro SQL

Diagrama de sintaxis de la sentencia open, con registro SQL
IDconjuntoResultados
ID que conecta la sentencia open con las sentencias get next, replace, delete y close posteriores. Para obtener detalles, consulte el apartado resultSetID.
scroll
Opción que permite moverse a través de un conjunto de resultados de varias maneras. La sentencia get next siempre está disponible, pero la utilización de scroll permite utilizar también las sentencias siguientes:
  • get absolute
  • get current
  • get first
  • get last
  • get previous
  • get relative

La opción scroll solo está disponible si está generando salida en Java.

hold
Mantiene la posición en un conjunto de resultados cuando se produce una operación de compromiso.
Nota: La opción hold solo está disponible si el controlador JDBC soporta JDBC 3.0 o una versión superior.
Nota: La opción hold está disponible para programas Java solamente si el controlador JDBC soporta JDBC 3.0 o una versión superior. La opción está disponible para programas COBOL. Sin embargo, si un programa destinado a CICS está segmentado, la opción hold no sirve de mucho ya que una operación de inversión en un programa segmentado finaliza la transacción CICS e impide que el programa retenga ninguna posición de archivo o base de datos.
La opción hold es adecuada en el siguiente caso:
  • Está utilizando la sentencia EGL open para abrir un cursor en lugar de un procedimiento almacenado; y
  • Desea comprometer los cambios periódicamente sin perder la posición en el conjunto de resultados; y
  • El sistema de gestión de bases de datos da soporte a la utilización de la opción WITH HOLD en le declaración de cursores SQL.
El código podría hacer lo siguiente, por ejemplo:
  1. Declarar una apertura de cursor ejecutando una sentencia EGL open
  2. Extraer una fila ejecutando una sentencia EGL get next
  3. Hacer lo siguiente en un bucle:
    1. Procesar los datos de alguna forma
    2. Actualizar la fila ejecutando una sentencia EGL replace
    3. Comprometer los cambios ejecutando la función de sistema sysLib.commit
    4. Extraer otra fila ejecutando una sentencia EGL get next

Si no especifica hold, la primera ejecución de paso 3d fallará debido a que el cursor ya no está abierto.

Los cursores para los que especifique hold no se cierran en una operación de compromiso, pero una operación de retrotracción o conexión a base de datos cierra todos los cursores.

Si no necesita conservar la posición del cursor durante una operación de compromiso, no especifique hold.

forUpdate
Opción que permite utilizar una sentencia EGL posterior para sustituir o suprimir los datos recuperados de la base de datos.

No puede especificar forUpdate si está llamando a un procedimiento almacenado para recuperar un conjunto de resultados.

usingKeys ... elemento
Identifica una lista de elementos de clave utilizados para construir el componente de clave-valor de la cláusula WHERE en la sentencia SQL implícita. La sentencia SQL implícita se utiliza durante la ejecución si no especifica una sentencia SQL explícita.

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 open.

La información de usingKeys se pasa por alto si especifica una sentencia SQL explícita.

with #sql{ sentencia SQL }
Una sentencia SQL SELECT explícita, que es opcional si también especifica un registro SQL. No deje espacios entre #sql y el corchete de apertura.
into ... elemento
Una cláusula INTO que identifica las variables de lenguaje principal EGL que reciben valores desde el cursor o procedimiento almacenado. 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.
with IDsentenciaPreparada
El identificador de una sentencia EGL prepare que prepara una sentencia SQL SELECT o CALL durante la ejecución. La sentencia open ejecuta la sentencia SQL SELECT o CALL dinámicamente. Para obtener detalles, consulte el apartado prepare.
using ... elemento
Una cláusula USING que identifica las variables de lenguaje principal EGL que quedan a disposición de la sentencia SQL SELECT o CALL durante la ejecución. 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.
nombre de registro SQL
Nombre de un registro de tipo SQLRecord. Es obligatorio el nombre de registro o un valor para sentenciaSQL; si se omite sentenciaSQL, la sentencia SQL SELECT se deriva del registro SQL.

A continuación se ofrecen ejemplos (suponiendo la existencia de un registro SQL denominado emp):

  open empSetId forUpdate for emp;

  open x1 with
    #sql{
      select empnum, empname, empphone 
      from employee 
      where empnum >= :empnum
 			  for update of empname, empphone
    }

  open x2 with 
    #sql{
      select empname, empphone
      from employee
      where empnum = :empnum
    }
  for emp;

  open x3 with
    #sql{
      call aResultSetStoredProc(:argumentItem)
    }

Proceso por omisión

Por omisión, el resultado de una sentencia open es el siguiente, cuando se especifica un registro SQL:
  • La sentencia open hace disponible un conjunto de filas. Cada columna de las filas seleccionadas está asociada con un elemento de estructura y, excepto las columnas que están asociadas con un elemento de estructura de sólo lectura, todas las columnas están a disposición de la actualización subsiguiente mediante una sentencia EGL replace.
  • Si sólo declara un elemento de clave para el registro SQL, la sentencia open selecciona todas las filas que cumplen la condición de selección por omisión específica del registro, siempre y cuando el valor de la columna de clave de tabla SQL sea igual o superior al valor del elemento de clave del registro SQL.
  • Si se declaran varias claves para el registro SQL, la condición de selección por omisión específica del registro es el único criterio de búsqueda y la sentencia open recupera todas las filas que cumplen ese criterio.
  • Si no especifica una clave de registro ni una condición de selección por omisión, la sentencia open selecciona todas las filas de la tabla.
  • Las filas seleccionadas no se ordenan.
La sentencia EGL open está representada en el código generado por una declaración de cursor que incluye una sentencia SQL SELECT o SELECT FOR UPDATE. Por omisión, se cumple lo siguiente:
  • La cláusula FOR UPDATE (si existe) no incluye elementos de estructura que sean de sólo lectura
  • La sentencia SQL SELECT de un registro determinado es similar a la sentencia siguiente:
      SELECT columna01, 
             columna02, ... 
             columnaNN
      INTO   :elementoRegistro01,
             :elementoRegistro02, ...
             :elementoRegistroNN
      FROM   nombreTabla 
      WHERE  columnaClave01 = :elementoClave01
      FOR UPDATE OF
             columna01, 
             columna02, ... 
             columnaNN

Puede alterar temporalmente el valor por omisión especificando una sentencia SQL en la sentencia EGL open.

Condiciones de error

Existen diversas condiciones que no son válidas, incluidas las siguientes:
  • Incluye una sentencia SQL a la que le falta una cláusula obligatoria para SELECT; las cláusulas obligatorias son SELECT, FROM y (si especifica forUpdate) FOR UPDATE OF
  • El registro SQL está asociado con una columna que no existe durante la ejecución o que es incompatible con el elemento de estructura relacionado
  • Especifica la opción forUpdate y el código intenta ejecutar una sentencia open en uno de los siguientes registros SQL:
    • Un registro SQL cuyos únicos elementos de estructura son de sólo lectura; o
    • Un registro SQL que está relacionado con más de una tabla SQL.
También surge un problema en el siguiente caso:
  1. Personaliza una sentencia EGL open para actualización, pero no puede indicar que una columna de tabla SQL determinada está disponible para actualización; y
  2. La sentencia replace que está relacionada con la sentencia open intenta revisar la columna.
Puede resolver este problema de cualquiera de estas formas:
  • Al personalizar la sentencia EGL open, incluya el nombre de columna en la sentencia SQL SELECT, cláusula FOR UPDATE OF; o
  • Al personalizar la sentencia EGL replace, elimine la referencia a la columna en la sentencia SQL UPDATE, cláusula SET; o
  • Acepte los valores por omisión para las sentencias open y replace.

Tareas relacionadas
Diagrama de sintaxis

Condiciones de uso | Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.