lunes, 23 de febrero de 2009

Borrado eficiente de muchos registros en una tabla

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;

No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM

Optimismo para una vida Mejor

Optimismo para una vida Mejor
Noticias buenas que comentar