Oracle PL/SQL BULK COLLECT : exemple FORALL
โก Rรฉsumรฉ intelligent
COLLECTE EN GROS Oracle PL/SQL rรฉcupรจre plusieurs lignes simultanรฉment dans une collection, tandis que FORALL renvoie des opรฉrations DML en masse ร la base de donnรฉes. Ces deux mรฉthodes rรฉduisent les changements de contexte entre les moteurs SQL et PL/SQL, amรฉliorant ainsi les performances.

Quโest-ce que la COLLECTE EN VRAC ?
BULK COLLECT rรฉduit les changements de contexte entre les SQL et le moteur PL/SQL, et permet au moteur SQL de rรฉcupรฉrer les enregistrements en une seule fois.
Oracle PL / SQL Cette fonction permet de rรฉcupรฉrer les enregistrements en masse plutรดt qu'un par un. Elle peut รชtre utilisรฉe dans une instruction SELECT pour remplir les enregistrements en bloc ou pour en rรฉcupรฉrer un seul. curseur En effet, BULK COLLECT rรฉcupรจre les enregistrements en masse ; la clause INTO doit donc toujours contenir une variable de type collection. Le principal avantage de BULK COLLECT rรฉside dans lโamรฉlioration des performances grรขce ร la rรฉduction des interactions entre la base de donnรฉes et le moteur PL/SQL.
syntaxe:
SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;
Dans la syntaxe ci-dessus, BULK COLLECT est utilisรฉ pour collecter les donnรฉes des instructions SELECT et FETCH.
Clause FORALL
L'instruction FORALL effectue Opรฉrations DML La fonction FORALL traite les donnรฉes en masse. Elle ressemble ร une boucle FOR, ร la diffรฉrence que dans une boucle FOR, les actions s'effectuent au niveau de l'enregistrement, tandis que dans FORALL, il n'y a pas de notion de boucle. Au lieu de cela, toutes les donnรฉes prรฉsentes dans la plage spรฉcifiรฉe sont traitรฉes simultanรฉment.
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 la plage infรฉrieure et la plage supรฉrieure.
Clause LIMITE
Le concept de collecte en bloc charge l'intรฉgralitรฉ des donnรฉes dans la variable de collecte cible en une seule opรฉration. Cependant, cette mรฉthode est dรฉconseillรฉe lorsque le nombre total d'enregistrements ร charger est trรจs important, car le chargement complet des donnรฉes par PL/SQL consomme davantage de mรฉmoire de session. Il est donc toujours prรฉfรฉrable de limiter la taille de cette opรฉration de collecte en bloc.
Cette limite de taille peut รชtre facilement atteinte en introduisant la condition ROWNUM dans l'instruction SELECT, alors que cela n'est pas possible dans le cas d'un curseur.
Pour surmonter cela, Oracle a fourni la clause LIMIT qui dรฉfinit le nombre d'enregistrements ร inclure dans le lot.
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 ainsi que la clause LIMIT.
BULK COLLECT Les attributs
ร l'instar des attributs de curseur, BULK COLLECT possรจde %BULK_ROWCOUNT(n) qui renvoie le nombre de lignes affectรฉes par la n-iรจme instruction DML de l'instruction FORALL. Autrement dit, cette mรฉthode indique le nombre d'enregistrements affectรฉs par l'instruction FORALL pour chaque valeur de la variable de collection. Le terme ยซ n ยป dรฉsigne la position de la valeur dans la collection pour laquelle le nombre de lignes est recherchรฉ.
Exemple 1: Dans cet exemple, nous allons extraire tous les noms des employรฉs de la table emp ร l'aide de BULK COLLECT, et nous allons รฉgalement augmenter le salaire de tous les employรฉs de 5000 ร l'aide de FORALL.
La capture d'รฉcran ci-dessous montre cet exemple de BULK COLLECT et FORALL ainsi que sa sortie dans Oracle.
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 salary=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รฉclarer lv_emp_name_tbl comme un type de table 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 une taille LIMIT de 5000 dans la variable lv_emp_name.
- Code lignes 8-11 : Mise en place d'une boucle FOR pour imprimer tous les enregistrements de la collection lv_emp_name.
- Code ligne 12: Utilisation de FORALL pour augmenter le salaire de tous les employรฉs de 5000.
- Code ligne 14: S'engager transaction.

