delete

La sentencia EGL delete elimina un registro de un archivo o una fila o un segmento de una base de datos DL/I.

Diagrama de sintaxis de la sentencia delete
nombre de registro
Nombre del objeto de E/S; un DLISegment, un registro indexado, relativo o SQL que se suprime.
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 llamada explícita DL/I DLET, como se describe en la sección dedicada a la directiva #dli. No deje espacios entre #dli y el corchete de apertura.
from IDconjuntoResultados
ID que conecta la sentencia delete con una sentencia get o open ejecutada antes en el mismo programa. Para obtener detalles, consulte el apartado resultSetID.

A continuación se ofrece un ejemplo:

  if (userRequest == "D")
    try
      get myRecord forUpdate;
      onException 
        myErrorHandler(12);   // sale del programa
    end

    try
      delete myRecord;
      onException 
        myErrorHandler(16);
    end
  end

El comportamiento de la sentencia delete depende 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.

Registro DLISegment

La sentencia delete genera una sentencia DL/I DLET. En DL/I, debe obtener y retener un segmento antes de suprimirlo. Las palabras clave EGL get...forUpdate, get next...forUpdate y get next inParent...forUpdate retendrán todas ellas el segmento solicitado para la supresión.

El ejemplo siguiente suprime un pedido de la base de datos de clientes:
	//crear instancias de los registros
	myCustomer CustomerRecord;
	myLocation LocationRecord;
	myOrder    OrderRecord;

	//crear un argumento de búsqueda de segmento
	myCustomer.customerNo = "005001";
	myLocation.locationNo = "000022";
	myOrder.orderDateNo = "20050730A003";

	//retener el registro de pedido solicitado
	try
		get myOrder forUpdate;
		onException
			myErrorHandler(2);
	end
	
	//suprimir el pedido
	try
		delete myOrder;
		onException
			myErrorHandler(7);
	end
La sentencia get...forUpdate genera SSA calificados para cliente, ubicación y pedido:
GHU STSCCST (STQCCNO = :myCust.customerNo) 
    STSCLOC (STQCLNO = :myLocation.locationNo) 
    STPCORD (STQCODN = :myOrder.orderDateNo)
A continuación, la sentencia delete genera simplemente lo siguiente:
DLET STPCORD

Registro indexado o relativo

Si desea suprimir un registro indexado o relativo, haga lo siguiente:
  • Emita una sentencia get para el registro y especifique la opción forUpdate
  • Emita la sentencia delete, sin que intervenga ninguna operación de E/S en el mismo archivo
Después de emitir la sentencia get, 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 el mismo archivo (con la opción forUpdate), una sustitución o supresión 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 archivo (sin la opción forUpdate) o es un cierre 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, debe utilizar la opción forUpdate en una sentencia EGL get o open para recuperar una fila para la supresión subsiguiente:
  • Puede emitir una sentencia get para recuperar la fila; o
  • Puede emitir una sentencia open para seleccionar un conjunto de filas y, a continuación, invocar una sentencia get next para recuperar la fila en cuestión.
En cualquier caso, la sentencia EGL delete está representada en el código generado por una sentencia SQL DELETE que hace referencia a la fila actual en un cursor. No puede modificar esa sentencia SQL, cuyo formato es el siguiente:
  DELETE FROM nombreTabla
    WHERE CURRENT OF cursor

Si desea escribir su propia sentencia SQL DELETE, utilice la sentencia EGL execute.

No puede utilizar una sola sentencia EGL delete para suprimir filas de varias tablas SQL.

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