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.

