Página principal  Página principalProgramación  ProgramaciónOracle  OracleVolver  Volver

Script de borrado masivo de filas


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;
Página principal  Página principalProgramación  ProgramaciónOracle  OracleVolver  VolverCreative Commons License 2003 by JM