Oracle PL/SQL BULK COLLECT : exemple FORALL

Quโ€™est-ce que la COLLECTE EN VRAC ?

BULK COLLECT rรฉduit les changements de contexte entre SQL et le moteur PL/SQL et permet au moteur SQL de rรฉcupรฉrer les enregistrements en mรชme temps.

Oracle PL/SQL offre la fonctionnalitรฉ de rรฉcupรฉration des enregistrements en masse plutรดt que de les rรฉcupรฉrer un par un. Ce BULK COLLECT peut รชtre utilisรฉ dans l'instruction 'SELECT' pour remplir les enregistrements en masse ou pour rรฉcupรฉrer le curseur en masse. ร‰tant donnรฉ que BULK COLLECT rรฉcupรจre l'enregistrement en BULK, la clause INTO doit toujours contenir une variable de type collection. Le principal avantage de l'utilisation de BULK COLLECT est qu'elle augmente les performances en rรฉduisant l'interaction entre la base de donnรฉes et le moteur PL/SQL.

syntaxe:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

Dans la syntaxe ci-dessus, BULK COLLECT est utilisรฉ pour collecter les donnรฉes des instructions 'SELECT' et 'FETCH'.

Clause FORALL

Le FORALL permet d'effectuer les opรฉrations DML sur des donnรฉes en masse. C'est similaire ร  celui de l'instruction de boucle FOR sauf dans Boucle POUR les choses se produisent au niveau de l'enregistrement alors que dans FORALL il n'y a pas de concept LOOP. Au lieu de cela, toutes les donnรฉes prรฉsentes dans la plage donnรฉe sont traitรฉes en mรชme temps.

syntaxe:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

Dans la syntaxe ci-dessus, l'opรฉration DML donnรฉe sera exรฉcutรฉe pour toutes les donnรฉes prรฉsentes entre les plages infรฉrieure et supรฉrieure.

Clause LIMITE

Le concept de collecte groupรฉe charge l'intรฉgralitรฉ des donnรฉes dans la variable de collecte cible en masse, c'est-ร -dire que l'ensemble des donnรฉes sera renseignรฉ dans la variable de collection en une seule fois. Mais cela n'est pas conseillรฉ lorsque l'enregistrement total ร  charger est trรจs volumineux, car lorsque PL / SQL essaie de charger toutes les donnรฉes, il consomme plus de mรฉmoire de session. Il est donc toujours bon de limiter la taille de cette opรฉration de collecte en masse.

Cependant, cette limite de taille peut รชtre facilement atteinte en introduisant la condition ROWNUM dans l'instruction 'SELECT', alors que dans le cas du curseur, cela n'est pas possible.

Pour surmonter cela Oracle a fourni la clause ยซ LIMIT ยป qui dรฉfinit le nombre d'enregistrements qui doivent รชtre inclus dans le bloc.

syntaxe:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

Dans la syntaxe ci-dessus, l'instruction de rรฉcupรฉration du curseur utilise l'instruction BULK COLLECT avec la clause LIMIT.

BULK COLLECT Les attributs

Similaire ร  curseur les attributs BULK COLLECT ont %BULK_ROWCOUNT(n) qui renvoie le nombre de lignes affectรฉes dans le nth Instruction DML de l'instruction FORALL, c'est-ร -dire qu'elle donnera le nombre d'enregistrements affectรฉs dans l'instruction FORALL pour chaque valeur de la variable de collection. Le terme ยซ n ยป indique la sรฉquence de valeurs dans la collection pour laquelle le nombre de lignes est nรฉcessaire.

Exemple 1: Dans cet exemple, nous projetterons tous les noms d'employรฉs de la table emp en utilisant BULK COLLECT et nous allons รฉgalement augmenter le salaire de tous les employรฉs de 5000 en utilisant FORALL.

BULK COLLECT Les attributs

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);
lv_emp_name lv_emp_name_tbl;
BEGIN
OPEN guru99_det;
FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;
FOR c_emp_name IN lv_emp_name.FIRST .. lv_emp_name.LAST
LOOP
Dbms_output.put_line(โ€˜Employee Fetched:โ€˜||c_emp_name);
END LOOP:
FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST
UPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;	
Dbms_output.put_line(โ€˜Salary Updatedโ€˜);
CLOSE guru99_det;
END;
/

Sortie

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

Code Explication:

  • Code ligne 2: Dรฉclaration du curseur guru99_det pour l'instruction 'SELECT emp_name FROM emp'.
  • Code ligne 3: Dรฉclaration de lv_emp_name_tbl comme type de table de VARCHAR2(50)
  • Code ligne 4: Dรฉclaration de lv_emp_name comme type lv_emp_name_tbl.
  • Code ligne 6: Ouverture du curseur.
  • Code ligne 7: Rรฉcupรฉration du curseur ร  l'aide de BULK COLLECT avec la taille LIMIT de 5000 intl lv_emp_name variable.
  • Code lignes 8-11 : Configuration de la boucle FOR pour imprimer tous les enregistrements de la collection lv_emp_name.
  • Code ligne 12: Utilisation de FORALL mettant ร  jour le salaire de tous les employรฉs de 5000.
  • Code ligne 14: Validation de la transaction.

Rรฉsumez cet article avec :