sql >> Databasteknik >  >> RDS >> Oracle

Hur man använder Bulk Collect-klausul med SELECT INTO-sats i Oracle Database

Massinsamlingsklausul med SELECT INTO-utlåtande

Välkommen till den andra handledningen i PL/SQL Bulk Collect-serien där vi kommer att lära oss hur man använder BULK COLLECT-satsen med SELECT-INTO-satsen.

Kontextväxlar är bra men bara när de är låga i antal. Ett ökat antal kontextväxlar kan orsaka problem som dåliga sökresultat. Denna overhead som orsakas av kontextväxlar skulle lätt kunna kontrolleras om vi kan komprimera dem. Det är precis vad du kommer att lära dig i den här självstudien.

Du kan lära dig mer om SELECT-INTO här .

När ska vi använda Bulk Collect med Select-Into-satsen?

När du är säker på att resultatet av din SELECT-sats är liten då bör du använda Bulk Collect-satsen med Select-Into-satsen. Annars kommer din bulk collect-klausul att göra din Select-Into-satsning till ett minnesvärt monster. Följaktligen kommer det att sakta ner prestandan för din databas.

Vad ska jag göra om min SELECT-sats hämtar ett stort antal rader?

Du kan alltid använda LIMIT-satsen tillsammans med Bulk Collect för att begränsa antalet rader som hämtas från databasen. Men detta är bara möjligt när vi använder Bulk Collect-satsen med PL/SQL-markörer. Icke desto mindre kommer vi att diskutera detta i detalj i nästa handledning.

Varför kan vi inte begränsa data som hämtas med Bulk Collect i SELECT-INTO-satsen?

När vi använder Bulk Collect-satsen med SELECT-INTO-satsen använder den implicit markör att utföra uppgiften att bearbeta massdata. Limit-klausul kan dock endast användas med Bulk Collect-sats, när den senare använder Explicit Cursor för databehandling.

När använder Bulk Collect-klausulen en implicit markör och när en explicit markör?

Om vi ​​använder Bulk Collect Clause med en SQL-sats som SELECT-INTO använder den en implicit markör. Å andra sidan när vi använder Bulk Collect-satsen med FETCH-satsen använder den en explicit markör.

Jag föreslår att du läser hur man skapar en explicit markör för att lära dig mer om FETCH-satsen.

Kan vi lagra resultatet som returneras av bulk collect-satsen i en variabel med primitiv datatyp?

Nej, från och med nu är PL/SQL-samlingar de enda stödjande datatyperna för bulkdatabearbetning med Bulk Collect-klausul i Oracle Database. Om du försöker lagra data som hämtats med Bulk Collect-satsen i en variabel av datatyp som Char, Number eller Varchar2 kommer du att få ett felmeddelande som kommer att läsa något så här:

"PLS-00497:Kan inte blanda mellan en rad och flera rader (BULK) i INTO-listan"

Definition av Bulk Collect Into Statement
"Bulk Collect Into"-satsen väljer flera data från en kolumn och lagrar dem i en SQL-samling.

Syntax för Bulk Collect-sats med Select-Into-sats.

Syntaxen för att använda PL/SQL Bulk Collect-klausul med Select-Into-sats i Oracle Database är följande:

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

Var:

Kolumnlista är listan över kolumner som du vill hämta data från.

Samlingsdatatypnamn kommer att vara namnet på insamlingsvariabeln som kommer att innehålla data som returneras av bulk collect-satsen.

Kom dessutom alltid ihåg att varje kolumn du angett för att hämta data måste ha en motsvarande insamlingsdatatyp för att hålla dessa data. Eftersom PL/SQL runtime-motorn alltid lagrar data som hämtas från kolumnen till samlingen på ett parallellt sätt.

Till exempel

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

Här kommer data som hämtas från column_1 att lagras i collection_1 och data från column_2 in collection_2 automatiskt.

Tabellnamn kan vara namnet på vilken tabell som helst från vilken du vill hämta data.

Följt av det har vi WHERE och ORDER BY klausuler som är valfria men om du vill kan du använda dem.

Nu när vi har diskuterat syntaxen, låt oss göra ett enkelt exempel för att lära oss hur man arbetar med PL/SQL Bulk Collect-satsen med SELECT INTO-satsen 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;
/

Förklaring av exemplet

Här har vi en mycket enkel kod för att visa hur man använder Bulk Collect Clause med Select-Into-satsen. I deklarationsavsnittet i den här koden skapade vi först två samlingar av kapslade tabelltyper "nt_fName" &"nt_lName" med deras motsvarande samlingsvariabler "fName" &"lName". I själva verket kommer båda dessa samlingar att användas för att lagra data som returneras av Select-Into-satsen.

Du kan läsa hur du skapar kapslade tabeller här.

I deklarationsavsnittet har vi vår Select-Into-sats med Bulk Collect-klausul. Genom att använda denna Select-Into-sats hämtar vi dessutom all data från kolumnen Förnamn och Efternamn i tabellen för anställda. Och med hjälp av Bulk Collect-klausulen lagrar vi dessa data i motsvarande samlingar parallellt.

Förutom tillsammans med Select-Into-satsen har vi också en "For Loop" som skriver ut data från båda samlingarna på utdataskärmen.

Måste titta
Se till att kolla in videon där jag demonstrerade hur Bulk Collect Clause komprimerar flera kontextväxlar till en och förbättrar prestandan för frågan. Här är länken.

Det är handledningen som förklarar begreppen i Bulk Collect-klausulen med Select-Into-satsen i detalj. I den här handledningen har jag försökt svara på alla möjliga frågor som du kan möta i ditt certifieringsprov såväl som i intervjun.

Hoppas du tyckte om att läsa. Se till att dela den här bloggen med dina vänner på din sociala sida. Tack och ha en bra dag!


  1. Hur man skapar ett navigeringsformulär i Microsoft Access

  2. Min MySQL-trigger fungerar inte, enkel syntax, inte komplicerad

  3. SQL - Call Stored Procedure för varje post

  4. Kul med (columnstore) komprimering på ett väldigt stort bord – del 3