Clause de collecte en bloc avec instruction FETCH INTO
Dans le didacticiel précédent, nous avons réussi à compresser plusieurs commutateurs de contexte en un seul en utilisant PL/SQL Bulk Collect avec l'instruction SELECT-INTO. L'instruction SELECT-INTO est une requête SQL standard, ce qui signifie que le développeur n'a pas beaucoup de contrôle sur l'exécution de l'instruction.
Si nous parlons de performances de requête, nous ne pouvons pas aller au-delà d'une étendue avec l'instruction SELECT-INTO. Voyons comment nous pouvons surmonter toutes ces lacunes de l'instruction SELECT-INTO.
Dans ce blog, vous apprendrez à utiliser la clause Bulk Collect avec l'instruction FETCH-INTO d'un curseur explicite. Comme les instructions FETCH font partie du cycle de vie du curseur, une connaissance pratique du curseur explicite est nécessaire pour une meilleure compréhension de ce didacticiel. Pour la même chose, vous pouvez consulter le tutoriel sur la création d'un curseur explicite dans la base de données Oracle.
Pourquoi devrions-nous utiliser la clause Bulk Collect avec l'instruction FETCH INTO ?
Comme mentionné dans le blog précédent, chaque fois que nous utilisons Bulk-Collect avec l'instruction SELECT-INTO, le moteur d'exécution utilise un curseur implicite pour traiter la tâche. Mais si nous utilisons Bulk Collect avec l'instruction FETCH-INTO, le moteur d'exécution utilisera le curseur explicite pour traiter la tâche.
Un curseur explicite nous aide toujours à obtenir un contrôle avancé sur nos requêtes SQL standard. Par exemple, avec un curseur explicite, nous pouvons contrôler quand récupérer les enregistrements ou combien d'enregistrements nous voulons récupérer à la fois, mais cela n'est pas possible dans le cas de l'instruction SELECT-INTO.
Quelle est la syntaxe de l'instruction Bulk Collect with Fetch-Into ?
Semblable à l'instruction SELECT-INTO, la clause de collecte en bloc fonctionne comme un attribut de l'instruction FETCH-INTO. Voici la syntaxe
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;
Les instructions FETCH font partie du curseur explicite. Si vous essayez de les exécuter sans déclarer leur curseur parent, vous obtiendrez une erreur. N'oubliez pas non plus que les collections PL/SQL sont la seule structure prise en charge pour la collecte en masse.
Exemple :Comment utiliser PL/SQL Bulk Collect avec l'instruction FETCH-INTO dans Oracle Database.
SET SERVEROUTPUT ON; DECLARE --Create an explicit cursor CURSOR exp_cur IS SELECT first_name FROM employees; --Declare collection for holding the data TYPE nt_fName IS TABLE OF VARCHAR2 (20); fname nt_fName; BEGIN OPEN exp_cur; LOOP FETCH exp_cur BULK COLLECT INTO fname; EXIT WHEN fname.count=0; --Print data FOR idx IN fname.FIRST.. fname.LAST LOOP DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) ); END LOOP; END LOOP; CLOSE exp_cur; END; /
J'ai expliqué en détail chaque ligne de tout ce code dans le didacticiel vidéo sur ma chaîne YouTube. Vous pouvez regarder ce tutoriel.
Étant donné que dans ce code, nous avons utilisé la clause Bulk Collect avec l'instruction fetch into, cela signifie que le changement de contexte ne sera pas un problème. Comme nous le savons, la clause de collecte en bloc comprime plusieurs commutateurs en un seul afin d'éviter tout goulot d'étranglement supplémentaire en termes de performances.
Mais cela signifie-t-il que ce code est bien optimisé et n'a pas besoin d'être optimisé ? Ou d'ailleurs, les performances des requêtes ne seront plus jamais un problème pour nous à l'avenir ?
Restez à l'écoute, pour obtenir les réponses à toutes ces questions ainsi que pour savoir comment nous pouvons optimiser davantage ce programme PL/SQL.
J'espère que vous avez apprécié ce blog. Si vous avez des doutes ou des questions ou si vous pensez que j'ai oublié de mentionner quelque chose dans ce blog, écrivez-moi sur ma page Facebook ou Twitter. Merci et bonne journée !