O uso do Bulk Collect é aplicado para a manipulação de grande massa de dados. Com seu uso correto, podemos ter vários tipos de ganhos, como por exemplo: Aplicações mais rápidas, alocação dos dados na memória, sem a necessidade de refazer a busca no banco. Mas como todo ganho, temos um risco também, pois se não aplicarmos corretamente as diretrizes na PGA(Program Global Area), podemos ter problemas na quantidade de dados carregados na memória.
Para resolver esse problemas temos a claúsula LIMIT, que limita os dados que foram para a memória.
Vamos criar uma tabela de exemplo:
CREATE TABLE EXER1 (
COD_NUMBER NUMBER(5),
DESCRICAO VARCHAR2(40),
CONSTRAINT EXER1_PK PRIMARY KEY (COD_NUMBER));
Inserindo os dados na tabela:
BEGIN
INSERT INTO EXER1
SELECT LEVEL, DBMS_RANDOM.STRING(‘A’, 40) FROM DUAL CONNECT BY LEVEL <= 100;
COMMIT;
END;
Vamos agora usar o Bulk Collect, colocando um limite de 70 registros. Isso possibilita colocar a cada loop apenas 70 registros na memória.
DECLARE
CURSOR CUR_EXER IS
SELECT COD_NUMBER, DESCRICAO FROM EXER1;
-–CRIANDO O TIPO PARA A COLEÇÃO
TYPE TROW_EXER1 IS TABLE OF CUR_EXER%ROW TYPE INDEX BY PLS_INTEGER;
-–DECLARANDO A COLEÇÃO ROW_TAB19X
ROW_EXER1 TROW_EXER1;
BEGIN
OPEN CUR_EXER;
LOOP
FETCH CUR_EXER BULK COLLECT
INTO ROW_EXER1 LIMIT 70;
EXIT WHEN ROW_EXER1.COUNT = 0;
FOR I IN1 .. ROW_EXER1.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(‘COD: ‘ || ROW_EXER1(I).COD_NUMBER || ‘ DESCRICAO: ‘ || ROW_EXER1(I).DESCRICAO);
END LOOP;
END LOOP;
CLOSE CUR_EXER;
END;
Bom, galera espero mais uma vez ter ajudado a todos!
Abraços.
Administrador e coordenador do site!