sql >> Databasteknik >  >> RDS >> Database

Hur man använder PL/SQL Bulk Collect-klausul med FETCH INTO-utlåtande

Massinsamlingsklausul med FETCH INTO-utlåtande

I den tidigare handledningen lyckades vi komprimera flera kontextväxlar till en enda genom att använda PL/SQL Bulk Collect med SELECT-INTO-satsen. SELECT-INTO-satsen är en SQL-standardfråga som innebär att utvecklaren inte har mycket kontroll över körningen av satsen.

Om vi ​​pratar om frågeprestanda kan vi inte gå längre än en omfattning med SELECT-INTO-satsen. Låt oss se hur vi kan övervinna alla dessa brister i SELECT-INTO-satsen.

I den här bloggen kommer du att lära dig hur du använder Bulk Collect-satsen med FETCH-INTO-satsen för en explicit markör. Eftersom FETCH-satser är en del av markörens livscykel krävs därför en praktisk kunskap om explicit markör för bättre förståelse av denna handledning. För detsamma kan du kolla in handledningen om hur man skapar en explicit markör i Oracle-databasen.

Varför ska vi använda Bulk Collect-satsen med FETCH INTO-satsen?

Som nämndes i föregående blogg när vi använder Bulk-Collect med SELECT-INTO-satsen använder runtime-motorn implicit markör för att bearbeta uppgiften. Men om vi använder Bulk Collect med FETCH-INTO-satsen kommer runtime-motorn att använda den explicita markören för att bearbeta uppgiften.

En explicit markör hjälper oss alltid att få förhandskontroll över våra vanliga SQL-frågor. Till exempel med en explicit markör kan vi styra när posterna ska hämtas eller hur många poster vi vill hämta på en gång, men detta är inte möjligt i fallet med SELECT-INTO-satsen.

Vad är syntaxen för Bulk Collect med Fetch-Into-satsen?

I likhet med SELECT-INTO-satsen fungerar bulk collect-satsen som ett attribut till FETCH-INTO-satsen. Här är syntaxen

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

FETCH-satser är en del av explicit markör. Om du försöker köra dem utan att deklarera deras överordnade markör får du ett felmeddelande. Kom också alltid ihåg att PL/SQL-samlingar är den enda strukturen som stöds för massinsamling.

Exempel:Hur man använder PL/SQL Bulk Collect med FETCH-INTO-satsen i 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;
/

Jag har förklarat varenda rad i hela den här koden i detalj i videohandledningen på min YouTube-kanal. Du kan titta på den här handledningen.

Eftersom vi i den här koden har använt Bulk Collect-satsen med fetch into-satsen betyder det att kontextbyte inte kommer att vara ett problem. Som vi vet komprimerar bulk collect-klausulen flera switchar till en enda så ingen ytterligare prestandaflaskhals.

Men betyder det att den här koden är väl optimerad och behöver ingen ytterligare optimering? Eller för den delen kommer Frågeprestanda aldrig att vara ett problem för oss i framtiden?

Håll utkik för att få svaren på alla dessa frågor samt för att lära dig hur vi kan optimera detta PL/SQL-program ytterligare.

Hoppas du gillade den här bloggen. Om du har några tvivel eller frågor eller om du tror att jag har glömt att nämna något i denna blogg, skriv till mig på min Facebook-sida eller Twitter. Tack och ha en bra dag!


  1. pg_dump postgres-databas från fjärrserver när port 5432 är blockerad

  2. Hur man återställer plåstret efter misslyckad cutover-fas i R12.2

  3. Referensdatamönstret:utbyggbart och flexibelt

  4. Lägga till flera kolumner EFTER en specifik kolumn i MySQL