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!