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

Sådan bruges Bulk Collect-klausul med SELECT INTO-erklæring i Oracle-databasen

Masseindsamlingsklausul med SELECT INTO-erklæring

Velkommen til den anden vejledning i PL/SQL Bulk Collect-serien, hvor vi vil lære, hvordan man bruger BULK COLLECT-sætning med SELECT-INTO-sætning.

Kontekstskift er gode, men kun når de er lave i antal. Øget antal kontekstskift kan forårsage problemer såsom dårlig forespørgselsydeevne. Denne overhead forårsaget af kontekstswitche kunne nemt kontrolleres, hvis vi kan komprimere dem. Det er præcis, hvad du vil lære i dette selvstudie.

Du kan lære mere om SELECT-INTO her .

Hvornår skal vi bruge Bulk Collect med Select-Into-erklæring?

Når du er sikker på, at det returnerende resultat af din SELECT-sætning er lille så skal du bruge Bulk Collect-klausulen med Select-Into-sætning. Ellers vil din bulk collect-klausul gøre din Select-Into-sætning til et hukommelsessvinende monster. Følgelig vil det bremse din databases ydeevne.

Hvad skal jeg gøre, hvis min SELECT-sætning henter et stort antal rækker?

Du kan altid bruge LIMIT-klausulen sammen med Bulk Collect for at begrænse antallet af rækker, der hentes fra databasen. Men dette er kun muligt, når vi bruger Bulk Collect-klausulen med PL/SQL-markører. Ikke desto mindre vil vi diskutere dette i detaljer i det næste selvstudie.

Hvorfor kan vi ikke begrænse de data, der hentes ved hjælp af Bulk Collect i SELECT-INTO-sætningen?

Når vi bruger Bulk Collect-klausul med SELECT-INTO-sætning, bruger den implicit markør at udføre opgaven med bulk databehandling. Limit-klausul kan dog kun bruges med Bulk Collect-klausul, når sidstnævnte bruger Eksplicit markør til databehandling.

Hvornår bruger Bulk Collect-klausulen en implicit markør, og hvornår en eksplicit markør?

Hvis vi bruger Bulk Collect Clause med en SQL-sætning såsom SELECT-INTO, bruger den en implicit markør. På den anden side, når vi bruger Bulk Collect-klausulen med FETCH-sætningen, bruger den en eksplicit markør.

Jeg foreslår, at du læser hvordan man opretter en eksplicit markør for at lære mere om FETCH-sætning.

Kan vi gemme resultatet returneret af bulk collect-klausulen i en variabel med primitiv datatype?

Nej, fra nu af er PL/SQL-samlinger de eneste understøttende datatyper til bulkdatabehandling med bulkindsamlingsklausul i Oracle-databasen. Hvis du prøver at gemme de data, der er hentet ved hjælp af Bulk Collect-klausulen, i en variabel af datatype såsom Char, Number eller Varchar2, vil du få en fejl, som vil læse noget som dette:

"PLS-00497:Kan ikke blande mellem enkelt række og multi-række (BULK) i INTO-listen"

Definition af masseindsamling i erklæring
"Bulk Collect Into"-sætningen vælger flere data fra en kolonne og gemmer dem i en SQL-samling.

Syntaks for Bulk Collect-sætning med Select-Into-sætning.

Syntaksen for at bruge PL/SQL Bulk Collect-klausul med Select-Into-sætning i Oracle Database er som følger:

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

Hvor:

Kolonneliste er listen over kolonner, hvorfra du vil hente dataene.

Samlingsdatatypenavn vil være navnet på den indsamlingsvariabel, som vil indeholde de data, der returneres af bulk collect-klausulen.

Husk desuden altid, at hver kolonne, du har angivet for at hente dataene, skal have en tilsvarende indsamlingsdatatype for at opbevare disse data. Fordi PL/SQL runtime engine altid gemmer de data, der hentes fra kolonnen, ind i samlingen parallelt.

For eksempel

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

Her bliver dataene hentet fra column_1 gemt i collection_1 og data fra column_2 i collection_2 automatisk.

Tabelnavn kunne være navnet på enhver tabel, hvorfra du vil hente dataene.

Efterfulgt af det har vi WHERE og ORDER BY-klausulen, som er valgfri, men hvis du vil, kan du bruge dem.

Nu hvor vi har diskuteret syntaksen, lad os lave et simpelt eksempel for at lære, hvordan man arbejder med PL/SQL Bulk Collect-klausul med SELECT INTO-sætning i 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;
/

Forklaring af eksemplet

Her har vi en meget simpel kode til at demonstrere, hvordan man bruger Bulk Collect Clause med Select-Into-sætning. I deklarationsafsnittet i denne kode oprettede vi først to indlejrede tabeltypesamlinger "nt_fName" &"nt_lName" med deres tilsvarende samlingsvariabler "fName" &"lName". Faktisk vil begge disse samlinger blive brugt til at opbevare de data, der returneres af Select-Into-sætningen.

Du kan læse, hvordan du opretter indlejret tabel her.

I erklæringssektionen har vi vores Select-Into-erklæring med Bulk Collect-klausul. Ved at bruge denne Select-Into-erklæring henter vi desuden alle data fra kolonnen Fornavn og Efternavn i medarbejdertabellen. Og ved hjælp af Bulk Collect-klausulen gemmer vi disse data til tilsvarende samlinger parallelt.

Bortset fra sammen med Select-Into-sætningen har vi også en "For Loop" som udskriver data fra begge samlinger på outputskærmen.

Skal se
Sørg for at tjekke videoen, hvor jeg demonstrerede, hvordan Bulk Collect Clause komprimerer flere kontekstskift til én og forbedrer forespørgslens ydeevne. Her er linket.

Det er selvstudiet, der forklarer begreberne i Bulk Collect-klausulen med Select-Into-sætning i detaljer. I dette selvstudie har jeg prøvet at besvare alle de mulige spørgsmål, som du kunne stå over for i din certificeringseksamen såvel som i interviewet.

Håber du nød at læse. Sørg for at DEL denne blog med dine venner på dit sociale område. Tak og god dag!


  1. Slå advarsler og fejl fra på PHP og MySQL

  2. Sådan fungerer SCHEMA_ID() i SQL Server

  3. Korrekt måde at give brugere adgang til yderligere skemaer i Oracle

  4. oracle forespørgsel sekventiel summering pr. rækker