La sentencia DELETE se utiliza con tablas internas y con tablas de base de datos. Esta lección trata de enseñarle cómo utilizar la sentencia DELETE con tablas de base de datos para eliminar múltiples registros.
DELETE { {FROM target [WHERE sql_cond]}
| {target FROM source} }.
- Efecto
La instrucción DELETE elimina una o más filas de la tabla de base de datos especificada en target. Las filas que se van a eliminar se declaran en una condición WHERE sql_cond o con objetos de datos en origen.
La instrucción DELETE establece los valores de los campos del sistema SY-SUBRC y SY-DBCNT.
0 cuando se declaró la condición WHERE, se eliminó al menos una fila. Cuando se declaró un área de trabajo en el origen, se eliminó la fila declarada. En la declaración de una tabla interna en origen, todas las filas declaradas se eliminaron o la tabla interna está vacía. Si no se declararon las condiciones, se eliminaron todas las filas.
4 cuando se declaró una condición WHERE o un área de trabajo en el origen, no se eliminaron filas. Cuando se declaró una tabla interna en el origen, no se eliminaron todas las filas especificadas. Si no se especificaron condiciones, no se eliminaron filas, ya que la tabla de la base de datos ya estaba vacía.
La instrucción DELETE establece en la variable del sistema SY-DBCNT el número de filas modificadas. Si se produce un desbordamiento porque el número o filas es mayor que 2.147.483.647, SY-DBCNT se establece en -1. Si SY-SUBRC es 2, SY-DBCNT también se establece en el valor -1.
- Notas
- Las filas se eliminan permanentemente de la tabla de base de datos en el siguiente COMMIT de base de datos. Hasta ese momento, todavía se pueden deshacer usando la sentencia ROLLBACK.
- La instrucción DELETE establece un bloqueo de base de datos hasta el siguiente COMMIT o ROLLBACK. Si se utiliza incorrectamente, puede producir un deadlock.
- El número de filas que se pueden eliminar de las tablas de una base de datos dentro de una LUW de base de datos es limitado, ya que un sistema de base de datos sólo puede administrar una cantidad limitada de bloqueos y datos en el área del ROLLBACK.
- CLIENT SPECIFIED
Si se utiliza la adición CLIENT SPECIFIED, se respeta el ID del mandante especificado en la fuente. Sin la adición CLIENT SPECIFIED, el entorno de ejecución ABAP no pasa el ID del mandante especificado en el origen al sistema de base de datos, sino que pasa el ID del mandante actual en su lugar.
… dbtab|(dbab_syntax) [CLIENT SPECIFIED]
Las entradas del “target” determinan, de forma estática o dinámica, la tabla de la base de datos o la vista a la que se accede y el control del manejo del mandante.
Sólo se pueden especificar las vistas que hacen referencia a una tabla de base de datos única y cuyo estado en el diccionario ABAP permite cambios.
En lugar de la especificación estática, se puede especificar un objeto de datos entre paréntesis dbtab_syntax, que debe contener el nombre de la tabla de base de datos o la vista cuando se ejecuta la sentencia. Para el objeto de datos dbtab_syntax se puede especificar un objeto de datos de tipo carácter o una tabla estándar sin claves de tabla secundaria. La sintaxis en dbtab_syntax no es como en ABAP Editor, sensible a mayúsculas y minúsculas.
Si se especifica una tabla interna itab, el sistema procesa todas las filas de la tabla intern. El tipo de fila de la tabla interna debe cumplir los requisitos previos para su uso en Open SQL statements.
Si para una fila de la tabla interna, no hay fila en la base de datos con el mismo contenido que la clave primaria, la fila relevante se ignora y el valor de la variable del sistema SY-SUBRC se establece en 4. Si la tabla interna está vacía no se elimina ningún registro en base de datos. Sin embargo, el valor de la variable del sistema SY-SUBRC se fija en 0. El valor de SY-DBCNT del campo del sistema se fija al número de filas que realmente se eliminan.
- Aplicación práctica
En un programa ejecutable realizamos una selección de datos de la tabla estándar ZSCARRUSUARIOSAP obteniendo en una tabla interna las compañías aéreas QF – Qantas Airways y SA – South African Air y eliminamos de la base de datos los registros obtenidos.
- Implementamos el código fuente.
- Ejecutamos el programa.
- En la transacción del diccionario de datos SE11 puede visualizar que los registros se eliminaron de la tabla de base de datos.
- Artículos relacionados
ABAP Open SQL – Eliminar un registro en base de datos utilizando la sentencia DELETE
ABAP Open SQL – Eliminar registro en base de datos utilizando la sentencia DELETE con filtros