La gestión de una base de datos implica no solo insertar y actualizar información, sino también la necesidad de eliminar datos que ya no son relevantes o necesarios. En Oracle Database, la forma estándar y fundamental de lograr esto es mediante el uso de la sentencia DELETE.

La sentencia DELETE es una poderosa herramienta de Lenguaje de Manipulación de Datos (DML) que te permite eliminar filas existentes de diversos objetos dentro de tu esquema o de otros esquemas a los que tengas acceso y los permisos adecuados.

- ¿Qué Objetos Permiten la Eliminación con DELETE?
- Permisos Necesarios para Eliminar Datos
- Sintaxis Básica de la Sentencia DELETE
- Consideraciones Importantes al Eliminar Datos
- Tabla Comparativa: Eliminación Selectiva vs. Eliminación Total
- Preguntas Frecuentes sobre la Eliminación en Oracle
- ¿Cuál es la diferencia entre DELETE y TRUNCATE TABLE?
- ¿Puedo recuperar datos después de un DELETE?
- ¿Cómo elimino todas las filas de una tabla?
- ¿Necesito tener permisos especiales para usar la cláusula RETURNING?
- ¿Qué sucede con los índices después de un DELETE?
- ¿Puedo eliminar datos de una base de datos remota?
- Conclusión
¿Qué Objetos Permiten la Eliminación con DELETE?
La sentencia DELETE en Oracle es versátil y puede aplicarse a varios tipos de objetos de la base de datos. Entender qué objetos son compatibles es crucial para una gestión de datos efectiva:
- Tablas: Puedes eliminar filas directamente de una tabla, ya sea particionada o no particionada.
- Tabla Base de una Vista: Al ejecutar un
DELETEsobre una vista, Oracle realmente elimina las filas correspondientes de la tabla base subyacente a la vista. Sin embargo, hay restricciones sobre qué tipos de vistas permiten la eliminación directa (por ejemplo, vistas con operaciones de conjunto, agregaciones o ciertas cláusulas están restringidas a menos que se usen triggers INSTEAD OF). - Tabla Contenedora de una Vista Materializada Escribible: Si eliminas filas de una vista materializada que está configurada como escribible (writable), las filas se eliminan de la tabla contenedora subyacente. Es importante notar que estas eliminaciones serán sobrescritas durante la próxima operación de refresco de la vista materializada.
- Tabla Maestra de una Vista Materializada Actualizable: Si la vista materializada es parte de un grupo de vistas materializadas y es actualizable (updatable), la eliminación de filas también resultará en la eliminación de las filas correspondientes en la tabla maestra.
Es vital recordar que no puedes eliminar filas de vistas materializadas de solo lectura.
Permisos Necesarios para Eliminar Datos
Para poder ejecutar una sentencia DELETE con éxito, tu usuario debe contar con los privilegios necesarios. Oracle implementa un robusto sistema de seguridad para controlar quién puede modificar los datos. Los requisitos de permisos incluyen:
- Tener el privilegio de objeto DELETE sobre la tabla o vista materializada de la que deseas eliminar filas.
- Si eliminas de la tabla base de una vista, el propietario del esquema de la vista debe tener el privilegio DELETE sobre la tabla base. Además, si la vista no está en tu propio esquema, tú debes tener el privilegio DELETE sobre la vista.
- El privilegio de sistema DELETE ANY TABLE te permite eliminar filas de cualquier tabla o partición de tabla, o de la tabla base de cualquier vista, sin necesidad de privilegios de objeto específicos.
- Para eliminar datos de un objeto en una base de datos remota (usando un dblink), también necesitas el privilegio de objeto READ o SELECT sobre ese objeto remoto.
- Si el parámetro de inicialización
SQL92_SECURITYestá configurado como TRUE y la operaciónDELETEhace referencia a columnas de la tabla (por ejemplo, en la cláusulaWHEREoRETURNING), entonces debes tener el privilegio de objeto SELECT sobre el objeto del que deseas eliminar filas.
Además, no puedes eliminar filas de una tabla si un índice basado en funciones en esa tabla ha quedado inválido. Primero debes validar el índice.
Sintaxis Básica de la Sentencia DELETE
La sintaxis básica de la sentencia DELETE es relativamente sencilla, pero puede volverse más compleja con cláusulas opcionales:
DELETE [hint] FROM dml_table_expression_clause [where_clause] [returning_clause] [error_logging_clause]
Analicemos las cláusulas más importantes:
La Cláusula FROM
La cláusula FROM especifica el objeto de la base de datos (tabla, vista, vista materializada, o incluso el resultado de una subconsulta) del que deseas eliminar filas. Puedes especificar el esquema al que pertenece el objeto (esquema.objeto). Si omites el esquema, Oracle asume que el objeto está en tu propio esquema.
FROM esquema.tabla | vista | vista_materializada | subconsulta
La sintaxis ONLY es relevante solo para vistas que forman parte de una jerarquía de vistas. Usarla te permite eliminar filas solo de la vista especificada y no de sus subvistas.
Puedes referenciar objetos en bases de datos remotas utilizando un dblink (enlace de base de datos). Esto requiere que estés utilizando la funcionalidad de base de datos distribuida de Oracle.
La Cláusula WHERE
La cláusula WHERE es fundamental y se utiliza para especificar una condición que filtra las filas a eliminar. Solo las filas que cumplen esta condición serán eliminadas. Si omites la cláusula WHERE, Oracle eliminará todas las filas del objeto especificado.
WHERE condición
La condición puede ser cualquier condición válida que puedas usar en una cláusula WHERE de una sentencia SELECT. Puede hacer referencia a columnas del objeto del que estás eliminando y puede contener subconsultas.
Por ejemplo, para eliminar todos los empleados del departamento 10:
DELETE FROM empleados WHERE id_departamento = 10;Para eliminar un empleado específico por su ID:
DELETE FROM empleados WHERE id_empleado = 1001;La cláusula WHERE es tu principal herramienta para realizar eliminaciones selectivas y evitar borrar datos accidentalmente.
La Cláusula RETURNING
La cláusula RETURNING es una característica muy útil que te permite recuperar valores de las filas que acaban de ser eliminadas, todo dentro de la misma sentencia DELETE. Esto elimina la necesidad de ejecutar una sentencia SELECT separada antes o después del DELETE para obtener información sobre las filas afectadas.
RETURNING expr1, expr2, ... INTO variable1, variable2, ...
Puedes especificar una lista de expresiones (expr) que representen los valores de las columnas de las filas eliminadas. Estas expresiones pueden ser columnas simples, pseudo-columnas como ROWID, o referencias (REF) a las filas afectadas.
La cláusula INTO especifica las variables (variables de host o variables PL/SQL) donde se almacenarán los valores recuperados. Debe haber una variable correspondiente y compatible con el tipo de datos para cada expresión en la lista RETURNING.

Si la sentencia DELETE afecta a una sola fila, puedes almacenar los valores en variables escalares. Si afecta a múltiples filas, debes usar colecciones y la cláusula BULK COLLECT junto con INTO para almacenar los resultados en arrays (colecciones).
Ejemplo con una sola fila:
DECLARE v_nombre VARCHAR2(100); v_salario NUMBER;BEGIN DELETE FROM empleados WHERE id_empleado = 1001 RETURNING nombre, salario INTO v_nombre, v_salario; DBMS_OUTPUT.PUT_LINE('Empleado eliminado: ' || v_nombre || ', Salario: ' || v_salario);END;Ejemplo con múltiples filas usando BULK COLLECT:
DECLARE TYPE nombres_array IS TABLE OF VARCHAR2(100); TYPE salarios_array IS TABLE OF NUMBER; v_nombres nombres_array; v_salarios salarios_array;BEGIN DELETE FROM empleados WHERE id_departamento = 20 RETURNING nombre, salario BULK COLLECT INTO v_nombres, v_salarios; -- Procesar los arrays v_nombres y v_salariosEND;Es importante conocer las restricciones de la cláusula RETURNING:
- Las expresiones (
expr) paraDELETEdeben ser expresiones simples o funciones de agregación de conjunto único (no se pueden combinar). Las funciones de agregación no pueden incluirDISTINCT. - No se puede especificar para un insert multitable.
- No se puede usar con DML paralelo ni con objetos remotos.
- No puedes recuperar tipos de datos
LONGcon esta cláusula. - No puedes especificar esta cláusula para una vista sobre la que se ha definido un trigger
INSTEAD OF.
Otras Cláusulas
Aunque menos comunes en la eliminación básica, existen otras cláusulas:
- hint: Permite especificar comentarios que pasan instrucciones al optimizador de Oracle para influir en el plan de ejecución de la sentencia.
- error_logging_clause: Similar a la cláusula en la sentencia
INSERT, permite registrar información sobre errores que ocurran durante la ejecución de la sentenciaDELETEen una tabla de log especificada, permitiendo que la operación continúe para las filas que no fallan. - table_collection_expression: Permite tratar el valor de una expresión de colección (como una subconsulta que devuelve una tabla anidada) como si fuera una tabla para operaciones DML. Puede ser útil en eliminaciones correlacionadas.
Consideraciones Importantes al Eliminar Datos
Al igual que con cualquier operación de modificación de datos, eliminar datos tiene implicaciones que debes considerar:
- Triggers: La ejecución de una sentencia
DELETEsobre una tabla activará cualquier triggerDELETEdefinido en esa tabla. - Espacio: El espacio liberado por las filas eliminadas generalmente es retenido por la tabla y sus índices. No se libera automáticamente al sistema operativo. Puedes necesitar operaciones adicionales (como
ALTER TABLE ... SHRINK SPACEo exportación/importación) para reclamar este espacio. - Índices: Si la tabla o el objeto base tiene índices de dominio, la sentencia
DELETEejecutará las rutinas de eliminación apropiadas para el tipo de índice. - Restricciones: Las restricciones de integridad (como claves foráneas) pueden impedir la eliminación de filas si otras tablas dependen de ellas.
- Transacciones: La sentencia
DELETEes parte de una transacción. Los cambios no son permanentes hasta que se ejecuta unCOMMIT. UnROLLBACKpuede deshacer la eliminación si no se ha confirmado la transacción.
Tabla Comparativa: Eliminación Selectiva vs. Eliminación Total
La elección entre eliminar filas específicas o todas las filas depende completamente de tus requisitos. La cláusula WHERE es la clave para la eliminación selectiva.
| Aspecto | DELETE con WHERE (Selectiva) | DELETE sin WHERE (Total) |
|---|---|---|
| Propósito | Eliminar filas que cumplen una condición específica. | Eliminar todas las filas de una tabla/objeto. |
| Sintaxis | DELETE FROM ... WHERE condición; | DELETE FROM ... ; |
| Riesgo | Menor riesgo de pérdida de datos no deseada si la condición es correcta. | Alto riesgo de pérdida total de datos si se ejecuta por error. |
| Rendimiento (general) | Puede ser más lento que la eliminación total si la condición requiere escaneo completo o no usa índices eficientemente. | Generalmente más rápido para eliminar todas las filas que un DELETE con WHERE que afecte a la mayoría de las filas (aunque TRUNCATE TABLE suele ser más rápido aún para vaciar completamente una tabla, pero tiene diferencias importantes). |
| Uso de Undo/Redo | Genera registros de undo y redo para cada fila eliminada. Permite rollback. | Genera registros de undo y redo. Permite rollback. (Nota: TRUNCATE TABLE no genera undo/redo por fila y no permite rollback de la operación). |
| Activación de Triggers | Activa triggers DELETE por cada fila eliminada. | Activa triggers DELETE por cada fila eliminada. |
Es crucial entender que un DELETE sin cláusula WHERE eliminará ABSOLUTAMENTE todas las filas. Si lo que buscas es vaciar una tabla rápidamente y no necesitas que se disparen triggers DELETE por fila ni la posibilidad de rollback de la operación (solo de la estructura), la sentencia TRUNCATE TABLE es una alternativa más eficiente, aunque con semántica diferente.
Preguntas Frecuentes sobre la Eliminación en Oracle
¿Cuál es la diferencia entre DELETE y TRUNCATE TABLE?
DELETE es una sentencia DML que elimina filas una por una (lógicamente). Genera undo y redo logs por cada fila, permite rollback, dispara triggers DELETE y retiene el espacio. TRUNCATE TABLE es una sentencia DDL que elimina todas las filas de una tabla de forma mucho más rápida al desasignar las extensiones de datos. No genera undo/redo por fila (solo para la operación DDL), no dispara triggers DELETE y no permite rollback de la operación (solo un flashback table si está configurado). Es ideal para vaciar tablas grandes rápidamente cuando no necesitas triggers ni rollback por fila.
¿Puedo recuperar datos después de un DELETE?
Sí, siempre y cuando no hayas ejecutado un COMMIT. Si has eliminado datos por error, puedes usar la sentencia ROLLBACK para deshacer la transacción y restaurar los datos al estado anterior al DELETE.
¿Cómo elimino todas las filas de una tabla?
Para eliminar todas las filas usando DELETE, simplemente omite la cláusula WHERE: DELETE FROM nombre_tabla; Recuerda que esto activará triggers DELETE y generará undo/redo. Si prefieres una operación más rápida sin triggers ni rollback de la operación por fila, considera TRUNCATE TABLE nombre_tabla;.
¿Necesito tener permisos especiales para usar la cláusula RETURNING?
Sí, para especificar la cláusula RETURNING, debes tener el privilegio de objeto READ o SELECT sobre el objeto del que estás eliminando.
¿Qué sucede con los índices después de un DELETE?
Los índices se actualizan automáticamente para reflejar las filas eliminadas. El espacio liberado en los bloques de índice también se retiene generalmente. Si tienes índices basados en funciones, asegúrate de que sean válidos antes de eliminar.
¿Puedo eliminar datos de una base de datos remota?
Sí, puedes eliminar datos de un objeto en una base de datos remota utilizando un dblink, siempre que tengas los permisos necesarios (DELETE en el objeto remoto y READ/SELECT para la cláusula RETURNING si la usas) y que la funcionalidad de base de datos distribuida esté configurada.
Conclusión
La sentencia DELETE es una herramienta esencial para la administración de datos en Oracle Database, permitiendo la eliminación controlada de filas de tablas, vistas y vistas materializadas. Comprender sus privilegios necesarios, la función de la cláusula WHERE para la eliminación selectiva, y el uso eficiente de la cláusula RETURNING para recuperar información de las filas afectadas, te permitirá realizar operaciones de limpieza de datos de manera segura y eficaz. Utiliza siempre la cláusula WHERE a menos que intencionalmente desees eliminar todas las filas, y considera las implicaciones en triggers, espacio y la posibilidad de rollback.
Si quieres conocer otros artículos parecidos a Eliminar Datos en Oracle: Guía Completa puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL