BULK COLLECT: ejemplos

BULK COLLECT: ejemplos

Os recomiendo tambien leer: introducción a BULK COLLECT

EJEMPLO recuperar registros con bulk collect:

DECLARE
   TYPE t_salarios IS TABLE OF empleado.salario%TYPE;
   salarios t_salarios;
BEGIN
   SELECT salario BULK COLLECT INTO salarios FROM empleados
      WHERE ROWNUM <= 1000;
END;

EJEMPLO recuperar registros utilizando un cursor:

DECLARE
   TYPE DeptRecTab IS TABLE OF departamentos%ROWTYPE;
   dept_recs DeptRecTab;
   CURSOR c IS
      SELECT id_departamento, nob_departamento FROM departamentos WHERE id_departamento > 100;
BEGIN
   OPEN c;
   FETCH c BULK COLLECT INTO dept_recs;
END;

EJEMPLO borrado:

DECLARE
   TYPE t_lista_num IS TABLE OF empleados.id_empleado%TYPE;
   enums t_lista_num;
BEGIN
   -- enums devolvera los id_empleados de los empleados del departamento 25
   DELETE FROM empleados WHERE id_departamento = 25
      RETURNING id_empleado BULK COLLECT INTO enums;
END;

FORALL

La clausula FORALL permite sin cambio de contexto realizar una sentencia DML de manera masiva

SINTAXIS FORALL:

FORALL indice IN limite_inferior..limite_superior
   sentencia_SQL;

EJEMPLO BULK COLLECT Y FORALL:

declare
  type t_array_elementos is table of elementos_orig%rowtype
                      index by binary_integer;

  array_elementos t_array_elementos;

  cursor c1 is 
     select * from elemetos_orig;
  
  limit_in integer := 1000;
begin
  open cursor;
  loop
    fetch c1 bulk collect into array_elementos limit limit_in;

   begin
     forall i in 1..array_elementos.count save exceptions
       insert into elementos_dest2 values array_elementos (i);
   exception
     when others then
       dbms_output.put_line (sqlerrm);
   end;
   
   EXIT WHEN c1%NOTFOUND;
  end loop;
  commit;
  close c1;
exception
  when others then
    dbms_output.put_line (sqlerrm);
end;

EJEMPLO CON TRATAMIENTO DE EXCEPCIONES:

declare
  type t_array_elementos is table of elementos_orig%rowtype
                      index by binary_integer;

  array_elementos t_array_elementos;

  cursor cursor is 
     select * from elemetos_orig;
  
  errores PLS_INTEGER;
  array_dml EXCEPTIONS;
  PRAGMA EXCEPTION_INIT(dml_errors, -24381);
  
  limit_in PLS_INTEGER := 1000;
  
  total_errores PLS_INTEGER := 0;
BEGIN
  OPEN cursor;
  LOOP
   FETCH cursor BULK COLLECT INTO array_elementos LIMIT limit_in;

   BEGIN
	    FORALL i IN 1..array_elementos.COUNT SAVE EXCEPTIONS -- save exceptions evita, que se detenga, cpaturando la excepcion
	       INSERT INTO elementos_dest2 VALUES array_elementos (i);
   EXCEPTION
	   WHEN dml_errors THEN  -- Captura las excepciones al realizar operaciones DML
	        
	        -- Contabiliza los errores
	        errores := SQL%BULK_EXCEPTIONS.COUNT;
	        dbms_output.put_line('Cantidad de registros que fallaron: ' || errores);
	        total_errores := total_errores + errores;
	        
	        -- Extrae la información de los errores
	        FOR i IN 1 .. errores LOOP 
	            dbms_output.put_line('Error #' || i || ' at '|| 'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
	            dbms_output.put_line('Error message is ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
	        END LOOP;
   END;
   
   EXIT WHEN cursor%NOTFOUND;
  END LOOP;
  COMMIT;
  CLOSE cursor;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE (sqlerrm);
END;

Os recomiendo tambien leer: BULK COLLECT

Comments are closed.