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 un registro.
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|(dbtab_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 no hay ninguna fila en la base de datos con el mismo contenido que la clave primaria, no se suprime ninguna fila y SY-SUBRC se establece en 4.
De forma predeterminada, se realiza una gestión automática del mandante, lo que significa que no se tiene en cuenta el identificador del mandante especificado en wa, pero se utiliza el mandante actual. Esto no tiene ningún efecto sobre wa. Puede desactivar la gestión automática del mandante mediante la adición CLIENT SPECIFIED.
- Aplicación práctica
En un programa ejecutable eliminamos de la tabla de base de datos ZSCARRSA00001 el registro con el valor SR en el campo clave CARRID utilizando un área de trabajo.
- Implementamos el código fuente.
- Ejecutamos el programa.
- En la transacción del diccionario de datos SE11 podemos visualizar que el registro se eliminó de la tabla de base de datos.