sql >> Database >  >> RDS >> Database

PL/SQL Bulk Collect-clausule gebruiken met FETCH INTO-instructie

Bulk Collect-clausule met FETCH INTO-verklaring

In de vorige tutorial zijn we erin geslaagd om meerdere context-switches in één enkele te comprimeren door PL/SQL Bulk Collect met SELECT-INTO-statement te gebruiken. SELECT-INTO-instructie is een standaard SQL-query, wat betekent dat de ontwikkelaar niet veel controle heeft over de uitvoering van de instructie.

Als we het hebben over queryprestaties, kunnen we niet verder gaan dan een mate met de SELECT-INTO-instructie. Laten we eens kijken hoe we al deze tekortkomingen van de SELECT-INTO-instructie kunnen overwinnen.

In deze blog leer je hoe je de Bulk Collect-clausule gebruikt met een FETCH-INTO-statement van een expliciete cursor. Omdat FETCH-instructies deel uitmaken van de levenscyclus van de cursor, is een praktische kennis van expliciete cursor vereist voor een beter begrip van deze tutorial. Voor hetzelfde kun je de tutorial bekijken over het maken van een expliciete cursor in de Oracle-database.

Waarom zouden we de Bulk Collect-clausule gebruiken met de FETCH INTO-instructie?

Zoals vermeld in de vorige blog wanneer we Bulk-Collect gebruiken met SELECT-INTO-instructie, gebruikt de runtime-engine een impliciete cursor om de taak te verwerken. Maar als we Bulk Collect met FETCH-INTO-instructie gebruiken, gebruikt de runtime-engine de expliciete cursor om de taak te verwerken.

Een expliciete cursor helpt ons altijd om vooraf controle te krijgen over onze standaard SQL-query's. Met een expliciete cursor kunnen we bijvoorbeeld bepalen wanneer de records moeten worden opgehaald of hoeveel records we tegelijk willen ophalen, maar dit is niet mogelijk in het geval van de SELECT-INTO-instructie.

Wat is de syntaxis van Bulk Collect met Fetch-Into-statement?

Net als bij de SELECT-INTO-instructie, werkt de bulkcollect-clausule als een attribuut voor de FETCH-INTO-instructie. Hier is de syntaxis

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

FETCH-instructies maken deel uit van de expliciete cursor. Als u ze probeert uit te voeren zonder hun bovenliggende cursor te declareren, krijgt u een foutmelding. Onthoud ook altijd dat PL/SQL-verzamelingen de enige ondersteunde structuur zijn voor bulkverzameling.

Voorbeeld:PL/SQL Bulk Collect gebruiken met FETCH-INTO-statement in 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;
/

Ik heb elke regel van deze hele code in detail uitgelegd in de videozelfstudie op mijn YouTube-kanaal. Je kunt deze tutorial bekijken.

Aangezien we in deze code de Bulk Collect-clausule hebben gebruikt met de fetch-in-instructie, betekent dit dat het wisselen van context geen probleem zal zijn. Zoals we weten, comprimeert de bulkcollect-clausule meerdere switches in één, zodat er geen bottleneck meer is voor de prestaties.

Maar betekent dit dat deze code goed is geoptimaliseerd en geen verdere optimalisatie nodig heeft? Of zullen de prestaties van query's in de toekomst nooit een probleem voor ons zijn?

Blijf op de hoogte, om de antwoorden op al deze vragen te krijgen en om te leren hoe we dit PL/SQL-programma verder kunnen optimaliseren.

Ik hoop dat je genoten hebt van deze blog. Als je twijfels of vragen hebt of denkt dat ik iets ben vergeten te vermelden in deze blog, schrijf me dan op mijn Facebook-pagina of Twitter. Bedankt en een fijne dag verder!


  1. Slaapstandcriteria voor datums

  2. Inleiding tot SQL-opdrachten

  3. Voorbeeld van een eenvoudige samenvoeginstructie in SQL Server

  4. Hoe u Microsoft Access-foutcontrolemarkeringen kunt stoppen of beheren