Database
 sql >> Base de données >  >> RDS >> Database

Comment utiliser la clause de collecte en bloc PL/SQL avec l'instruction FETCH INTO

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 !