sql >> Database >  >> RDS >> Oracle

Bulk Collect-clausule gebruiken met SELECT INTO-instructie in Oracle Database?

Bulk Collect-clausule met SELECT INTO-instructie

Welkom bij de tweede tutorial in de PL/SQL Bulk Collect-serie waarin we zullen leren hoe we de BULK COLLECT-clausule kunnen gebruiken met de SELECT-INTO-instructie.

Context-switches zijn goed, maar alleen als ze laag in aantal zijn. Een groter aantal contextwisselingen kan problemen veroorzaken, zoals slechte queryprestaties. Deze overhead veroorzaakt door contextwisselingen kan gemakkelijk worden gecontroleerd als we ze kunnen comprimeren. Dit is precies wat je leert in deze zelfstudie.

Je kunt meer leren over SELECT-INTO hier .

Wanneer moeten we Bulk Collect met Select-Into-statement gebruiken?

Wanneer u zeker weet dat het terugkerende resultaat van uw SELECT-instructie klein . is dan moet u de Bulk Collect-clausule gebruiken met de Select-Into-instructie. Anders zal uw bulkcollect-clausule uw Select-Into-verklaring tot een geheugenverslindend monster maken. Bijgevolg zal het de prestaties van uw database vertragen.

Wat moet ik doen als mijn SELECT-instructie een enorm aantal rijen ophaalt?

U kunt altijd de LIMIT-clausule samen met Bulk Collect gebruiken om het aantal rijen dat uit de database wordt opgehaald te beperken. Maar dit is alleen mogelijk als we de Bulk Collect-clausule gebruiken met PL/SQL-cursors. Desalniettemin zullen we dit in detail bespreken in de volgende tutorial.

Waarom kunnen we de gegevens die worden opgehaald met Bulk Collect in de SELECT-INTO-instructie niet beperken?

Wanneer we de Bulk Collect-clausule gebruiken met de SELECT-INTO-instructie, gebruikt deze impliciet cursor om de taak van bulkgegevensverwerking uit te voeren. De limietclausule kan echter alleen worden gebruikt met de clausule Bulk Collect, wanneer de laatste Expliciete cursor gebruikt voor gegevensverwerking.

Wanneer gebruikt de Bulk Collect-clausule een impliciete cursor en wanneer een expliciete cursor?

Als we Bulk Collect-clausule gebruiken met een SQL-instructie zoals SELECT-INTO, wordt een impliciete cursor gebruikt. Aan de andere kant, wanneer we de Bulk Collect-clausule gebruiken met de FETCH-instructie, gebruikt deze een expliciete cursor.

Ik raad je aan om . te lezen hoe maak je een expliciete cursor voor meer informatie over de FETCH-instructie.

Kunnen we het resultaat dat wordt geretourneerd door de bulkcollect-clausule opslaan in een variabele van het primitieve gegevenstype?

Nee, vanaf nu zijn PL/SQL-verzamelingen de enige ondersteunende datatypes voor bulkgegevensverwerking met bulkcollect-clausule in Oracle Database. Als u probeert de gegevens die zijn opgehaald met de Bulk Collect-clausule op te slaan in een variabele van het gegevenstype zoals Char, Number of Varchar2, krijgt u een foutmelding die er ongeveer zo uitziet:

"PLS-00497:Kan niet mengen tussen enkele rij en meerdere rijen (BULK) in INTO-lijst"

Definitie van Bulk Collect in Statement
"Bulk Collect Into"-instructie selecteert meerdere gegevens uit een kolom en slaat deze op in een SQL-verzameling.

Syntaxis van Bulk Collect-clausule met Select-Into-instructie.

De syntaxis voor het gebruik van PL/SQL Bulk Collect-clausule met Select-Into-instructie in Oracle Database is als volgt:

SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

Waar:

Kolomlijst is de lijst met kolommen waaruit u de gegevens wilt ophalen.

Naam gegevenstype verzameling zal de naam zijn van de verzamelingsvariabele die de gegevens bevat die worden geretourneerd door de bulkcollect-clausule.

Onthoud bovendien altijd dat elke kolom die u hebt opgegeven voor het ophalen van de gegevens een bijbehorend verzamelingsgegevenstype moet bevatten om die gegevens te bewaren. Omdat de PL/SQL-runtime-engine de uit de kolom opgehaalde gegevens altijd parallel opslaat in de verzameling.

Bijvoorbeeld

SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

Hier worden de gegevens die zijn opgehaald uit kolom_1 automatisch opgeslagen in collection_1 en gegevens uit kolom_2 in collection_2.

Tabelnaam kan de naam zijn van elke tabel waaruit u de gegevens wilt ophalen.

Daarna hebben we de WHERE- en ORDER BY-clausules die optioneel zijn, maar als je wilt, kun je ze gebruiken.

Nu we de syntaxis hebben besproken, gaan we een eenvoudig voorbeeld geven om te leren werken met de PL/SQL Bulk Collect-clausule met de instructie SELECT INTO in Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
    
    fname   nt_fName;
    lName   nt_lName;
BEGIN
    SELECT first_name, last_name 
        BULK COLLECT INTO fName, lName 
    FROM employees; 
        
        --Print values from the collection--
    FOR idx IN 1..fName.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
    END LOOP;
END;
/

Uitleg van het voorbeeld

Hier hebben we een zeer eenvoudige code om te demonstreren hoe u de Bulk Collect-clausule met Select-Into-instructie kunt gebruiken. In het declaratiegedeelte van deze code hebben we eerst twee verzamelingen van het type Geneste tabel "nt_fName" en "nt_lName" gemaakt met de bijbehorende verzamelingsvariabelen "fName" &"lName". In feite zullen deze beide verzamelingen worden gebruikt om de gegevens te bewaren die worden geretourneerd door de Select-Into-instructie.

U kunt hier lezen hoe u een geneste tabel maakt.

In de aangiftesectie hebben we onze Select-Into-verklaring met Bulk Collect-clausule. Bovendien halen we door deze Select-Into-verklaring te gebruiken alle gegevens op uit de kolom Voornaam en Achternaam van de werknemerstabel. En met behulp van de Bulk Collect-clausule slaan we die gegevens op parallelle wijze op in overeenkomstige collecties.

Behalve samen met de Select-Into-instructie hebben we ook een "For Loop" die de gegevens van beide collecties afdrukt op het uitvoerscherm.

Moet kijken
Zorg ervoor dat je de video bekijkt waarin ik heb laten zien hoe Bulk Collect-clausule meerdere contextwisselingen in één comprimeert en de prestaties van de query verbetert. Hier is de link.

Dat is de tutorial waarin de concepten van de Bulk Collect-clausule met Select-Into-instructie in detail worden uitgelegd. In deze tutorial heb ik geprobeerd alle mogelijke vragen te beantwoorden die je zou kunnen tegenkomen in je certificeringsexamen en in het interview.

Ik hoop dat je het leuk vond om te lezen. Zorg ervoor dat je deze blog deelt met je vrienden op je social media. Bedankt en een fijne dag verder!


  1. selecteer count(*) uit de tabel van mysql in php

  2. INSERT IGNORE vs INSERT ... OP DUPLICATE KEY UPDATE

  3. Volgorde Door een parameter voor de kolomnaam te gebruiken

  4. Een willekeurig getal genereren binnen een opgegeven bereik in SQLite