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.

  • ๐Ÿ“ฆ COLLECTE EN GROS : Rรฉcupรจre plusieurs lignes en une seule passe dans une variable de collection, remplaรงant ainsi la rรฉcupรฉration lente ligne par ligne.
  • (I.e. POUR TOUS : Exรฉcute une seule opรฉration INSERT, UPDATE ou DELETE sur une collection entiรจre en un seul changement de contexte.
  • (I.e. Clause LIMITE : Limite le nombre de lignes rรฉcupรฉrรฉes par chaque chargement BULK COLLECT, protรฉgeant ainsi la mรฉmoire de session sur les grandes tables.
  • (I.e. COLLECTE EN VRAC Attributs : L'attribut %BULK_ROWCOUNT(n) indique combien de lignes la niรจme instruction DML FORALL a affectรฉes.
  • โš™๏ธ Collections requises : La clause INTO doit cibler un type de collection, tel qu'une table imbriquรฉe ou un tableau associatif.
  • ๐Ÿค– Assistance IA : Les assistants IA tels que GitHub Copilot rรฉdigent les blocs BULK COLLECT et FORALL et signalent une clause LIMIT manquante.

Oracle Prรฉsentation des instructions PL/SQL BULK COLLECT et FORALL avec la clause LIMIT

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.

COLLECTE EN VOLUME avec LIMITE et FORALL, exemple de mise ร  jour du salaire des employรฉs dans Oracle PL / SQL

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.

FAQ

Non. Une requรชte BULK COLLECT SELECT ne lรจve jamais l'exception NO_DATA_FOUND ; elle renvoie une collection vide. Il est toujours conseillรฉ de tester la collection avec la mรฉthode .COUNT avant de la consulter.ping, sinon vous risquez de traiter silencieusement zรฉro ligne.

L'option SAVE EXCEPTIONS permet ร  FORALL de continuer ร  s'exรฉcuter mรชme en cas d'รฉchec sur certaines lignes. Les lignes ayant รฉchouรฉ sont stockรฉes dans SQL%BULK_EXCEPTIONS. Oracle gรฉnรจre l'erreur ORA-24381, que vous piรฉgez dans un exception Gestionnaire pour inspecter chaque erreur.

Utilisez BULK COLLECT lorsqu'une boucle lit plusieurs lignes. curseur La boucle FOR rรฉcupรจre une ligne ร  chaque changement, donc la rรฉcupรฉration en masse combinรฉe ร  FORALL peut s'exรฉcuter beaucoup plus rapidement sur de grands ensembles de rรฉsultats.

BULK COLLECT renvoie plusieurs lignes simultanรฉment et nรฉcessite donc un conteneur multi-lignes. La cible INTO doit รชtre un collection comme un tableau imbriquรฉ, un VARRAY ou un tableau associatif, et non une simple variable scalaire.

Non. Une instruction FORALL exรฉcute une seule opรฉration INSERT, UPDATE, DELETE ou MERGE. Seules les valeurs de ses clauses VALUES et WHERE peuvent changer ร  chaque itรฉration. Pour plusieurs instructions, utilisez des instructions FORALL distinctes.

Le traitement par lots peut รชtre de plusieurs fois ร  plus de cent fois plus rapide que le code ligne par ligne, car BULK COLLECT et FORALL regroupent des milliers de changements de contexte du moteur en quelques-uns, rรฉduisant considรฉrablement la surcharge sur les grands volumes de donnรฉes.

Oui. Copilote GitHub Les brouillons de BULK COLLECT rรฉcupรจrent les boucles FORALL DML et les clauses LIMIT ร  partir d'un commentaire, et suggรจrent des dรฉclarations de type de collection, bien que vous deviez examiner vous-mรชme les tailles de lots et la gestion des erreurs.

Les assistants IA analysent les boucles qui rรฉcupรจrent ou modifient une ligne ร  la fois et recommandent de les rรฉรฉcrire avec BULK COLLECT, LIMIT et FORALL. Cette analyse par apprentissage automatique dรฉtecte les limites LIMIT manquantes et les goulots d'รฉtranglement des performances avant la mise en production.

Rรฉsumez cet article avec :