replace

La sentencia EGL replace coloca un registro cambiado en un archivo o base de datos.

Diagrama de sintaxis para la sentencia replace
nombre de registro
Nombre del objeto de E/S; un registro indexado, relativo o SQL.
with #sql{ sentencia SQL }
Una sentencia SQL UPDATE explícita. No deje espacios entre #sql y el corchete de apertura.
from IDconjuntoResultados
ID que conecta la sentencia replace con una sentencia get o open ejecutada antes en el mismo programa. Para obtener detalles, consulte el apartado resultSetID.
El ejemplo siguiente muestra cómo leer y sustituir un registro de archivo:
  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

Los detalles de la sentencia replace dependen del tipo de registro. Para obtener detalles acerca del proceso SQL, consulte el tema Registro SQL.

Registro indexado o relativo

Si desea sustituir un registro indexado o relativo, debe emitir una sentencia get para el registro con la opción forUpdate, y a continuación emitir la sentencia replace sin que intervenga ninguna operación de E/S en el mismo archivo. Después de invocar la sentencia replace, el resultado de la próxima operación de E/S en el mismo archivo será el siguiente:
  • Si la próxima operación de E/S es una sentencia replace en el mismo registro EGL, se cambia el registro del archivo
  • Si la próxima operación de E/S es una sentencia delete en el mismo registro EGL, el registro del archivo se marca para supresión
  • Si la próxima operación de E/S es una sentencia get en un registro del mismo archivo e incluye la opción forUpdate, una sentencia replace o delete subsiguiente es válida en el registro de archivo de lectura recién creado
  • Si la próxima operación de E/S es una sentencia get en el mismo registro EGL (sin la opción forUpdate) o es una sentencia close en el mismo archivo, el registro de archivo se libera sin cambios

Encontrará los detalles sobre la opción forUpdate en get.

Registro SQL

En el caso de procesos SQL, la sentencia EGL replace provoca una sentencia SQL UPDATE en el código generado.

Debe recuperar una fila para la sustitución subsiguiente, de cualquiera de estas dos formas:
  • Emita una sentencia get (con la opción forUpdate) para recuperar la fila; o
  • Emita una sentencia open para seleccionar un conjunto de filas y, a continuación, invoque una sentencia get next para recuperar la fila en cuestión.

Condiciones de error

Las condiciones siguientes se encuentran entre las que no son válidas al utilizar una sentencia replace:
  • Se especifica una sentencia SQL de un tipo que no es UPDATE
  • Se especifica alguna, pero no todas las cláusulas de una sentencia SQL UPDATE
  • No se especifica un valor resultSetID cuando es necesario; para obtener detalles, consulte el apartado resultSetID
  • Se especifica (o se acepta) una sentencia UPDATE que tiene una de estas características:
    • Actualiza varias tablas
    • Está asociada con una columna que no existe o que es incompatible con la variable de lenguaje principal relacionada
  • Se utiliza un registro SQL como objeto de E/S, y todos los elementos de registro son de sólo lectura
La situación siguiente también provoca un error:
  • Personaliza una sentencia EGL get con la opción forUpdate, pero no puede indicar que una columna de tabla SQL determinada está disponible para actualización; y
  • La sentencia replace que está relacionada con la sentencia get intenta revisar la columna.
Puede resolver la discrepancia anterior de cualquiera de estas formas:
  • Al personalizar la sentencia EGL get, 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 get y replace.

Sentencia SQL implícita

Por omisión, el resultado de una sentencia replace que escribe un registro SQL es el siguiente:
  • Como resultado de la asociación de elementos de registro y columnas de tabla SQL en la declaración de registro, el código generado copia los datos de cada elemento de registro en la columna de tabla SQL relacionada.
  • Si ha definido un elemento de registro como de sólo lectura, el valor de la columna que corresponde a ese elemento de registro no resulta afectado
La sentencia SQL tiene estas características por omisión:
  • La sentencia SQL UPDATE no incluye los elementos de registro de sólo lectura
  • La sentencia SQL UPDATE de un registro determinado es similar a la sentencia siguiente:
        UPDATE nombreTabla
        SET columna01 = :elementoRegistro01,
            columna02 = :elementoRegistro02,
                     .
                     .
                     .
            columnaNN = :elementoRegistroNN    WHERE CURRENT OF cursor

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