Esta función de PL/SQL realiza un borrado masivo de filas, haciendo COMMIT cada cierto número, y asegurándonos así de que los segmentos de rollback no se van a ser desbordados.
Parámetros: - NombreTabla (VARCHAR2): Nombre de la tabla donde se van a borrar los registros
- CondiciónWhere (VARCHAR2): Condición de borrado. Debe incluir la palabra "WHERE" como inicio de la cadena.
- RegistrosCommit (NUMBER): Frecuencia con que se realiza un COMMIT.
Ejemplos:
execute DeleteMasivo('EMPLEADOS', 'WHERE NUM BETWEEN 1 AND 9999', 100);
execute DeleteMasivo('EMPLEADOS', '', 100);
CREATE PROCEDURE DeleteMasivo( NombreTabla IN VARCHAR2,
CondicionWhere IN VARCHAR2 DEFAULT NULL,
RegistrosCommit IN NUMBER DEFAULT 1000 ) IS
idSelect INTEGER;
idDelete INTEGER;
execSelect INTEGER;
execDelete INTEGER;
SQLCursor VARCHAR2(2000);
ROWIDDelete ROWID;
BEGIN
--
-- Se prepara un cursor dinánico para seleccionar los ROWIDs
-- de los registros a borrar.
--
SQLCursor := 'SELECT rowid FROM ' || NombreTabla || ' ' || CondicionWhere;
idSelect := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(idSelect, SQLCursor, DBMS_SQL.v7);
DBMS_SQL.DEFINE_COLUMN_ROWID(idSelect, 1, ROWIDDelete);
execSelect := DBMS_SQL.EXECUTE(idSelect);
--
-- Se prepara el cursor para borrar los registros
--
idDelete := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(idDelete, 'DELETE FROM ' || NombreTabla ||
' WHERE ROWID = :rowid_delete', DBMS_SQL.v7);
LOOP
IF DBMS_SQL.FETCH_ROWS(idSelect) = 0 THEN
--
-- Obtiene los ROWIDs de las filas a borrar
--
DBMS_SQL.COLUMN_VALUE(idSelect, 1, ROWIDDelete);
DBMS_SQL.BIND_VARIABLE(idSelect, 'rowid_delete', ROWIDDelete);
--
-- Ejecuta el delete para las filas obtenidas
---
execDelete := DBMS_SQL.EXECUTE(idDelete);
--
-- Hace un commit cada n filas.
-- n se especifica en el parámetro "RegistrosCommit"
--
IF MOD(DBMS_SQL.LAST_ROW_COUNT, RegistrosCommit) = 0 THEN
COMMIT;
END IF;
ELSE
EXIT;
END IF;
END LOOP;
--
-- Hace commit otra vez, para validar el ultimo grupo de registros
--
COMMIT;
DBMS_SQL.CLOSE_CURSOR(idSelect);
DBMS_SQL.CLOSE_CURSOR(idDelete);
END DeleteMasivo;
|
|