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!