sql >> Database teknologi >  >> RDS >> Database

Sådan bruges PL/SQL Bulk Collect-klausul med FETCH INTO-erklæring

Masseindsamlingsklausul med FETCH INTO-erklæring

I den forrige tutorial lykkedes det os at komprimere flere kontekstskift til en enkelt ved at bruge PL/SQL Bulk Collect med SELECT-INTO-sætning. SELECT-INTO-sætningen er en SQL-standardforespørgsel, hvilket betyder, at udvikleren ikke har meget kontrol over udførelsen af ​​sætningen.

Hvis vi taler om forespørgselsydelse, kan vi ikke gå ud over et omfang med SELECT-INTO-sætning. Lad os se, hvordan vi kan overvinde alle disse mangler ved SELECT-INTO-erklæringen.

I denne blog vil du lære, hvordan du bruger Bulk Collect-klausulen med FETCH-INTO-sætning af en eksplicit markør. Da FETCH-udsagn er en del af markørens livscyklus, kræves et praktisk kendskab til eksplicit markør for bedre forståelse af denne øvelse. For det samme kan du tjekke selvstudiet om, hvordan du opretter en eksplicit markør i Oracle-databasen.

Hvorfor skal vi bruge Bulk Collect-klausul med FETCH INTO-sætning?

Som nævnt i den forrige blog, når vi bruger Bulk-Collect med SELECT-INTO-sætning, bruger runtime-motoren implicit markør til at behandle opgaven. Men hvis vi bruger Bulk Collect med FETCH-INTO-sætning, vil runtime-motoren bruge den eksplicitte markør til at behandle opgaven.

En eksplicit markør hjælper os altid med at få forhåndskontrol over vores standard SQL-forespørgsler. For eksempel med en eksplicit markør kan vi kontrollere, hvornår posterne skal hentes, eller hvor mange poster vi ønsker at hente på én gang, men dette er ikke muligt i tilfælde af SELECT-INTO-sætning.

Hvad er syntaksen for Bulk Collect med Fetch-Into-sætning?

I lighed med SELECT-INTO-sætningen fungerer bulk collect-sætning som en attribut til FETCH-INTO-sætningen. Her er syntaksen

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

FETCH-udsagn er en del af eksplicit markør. Hvis du prøver at udføre dem uden at angive deres overordnede markør, får du en fejl. Husk også altid, at PL/SQL-samlinger er den eneste understøttede struktur til masseindsamling.

Eksempel:Sådan bruger du PL/SQL Bulk Collect med FETCH-INTO-sætning i Oracle-databasen.

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;
/

Jeg har forklaret hver enkelt linje i hele denne kode i detaljer i videotutorialen på min YouTube-kanal. Du kan se denne øvelse.

Da vi i denne kode har brugt Bulk Collect-klausulen med fetch into-sætningen, betyder det, at kontekstskift ikke vil være et problem. Som vi ved, komprimerer bulk collect-klausulen flere switches til en enkelt, så der ikke længere er ydeevne flaskehals.

Men betyder det, at denne kode er godt optimeret og ikke behøver yderligere optimering? Eller for den sags skyld vil forespørgselsydeevne aldrig være et problem for os i fremtiden?

Følg med for at få svar på alle disse spørgsmål samt for at lære, hvordan vi yderligere kan optimere dette PL/SQL-program.

Håber du nød denne blog. Hvis du er i tvivl eller har spørgsmål, eller du tror, ​​jeg har glemt at nævne noget i denne blog, så skriv til mig på min Facebook-side eller Twitter. Tak og god dag!


  1. Oracle-klientinstallationsfejl - stien er for lang

  2. Tuning:Et godt sted at starte

  3. Hvad er forskellen mellem visninger og materialiserede visninger i Oracle?

  4. Sådan udføres SQL-forespørgsel uden at vise resultater