Masseindsamlingsklausul med FETCH INTO-erklæring
I den forrige tutorial lykkedes det os at komprimere flere kontekstskift til en enkelt ved at bruge PL/SQL Bulk Collect med SELECT-INTO-sætning. SELECT-INTO-sætningen er en SQL-standardforespørgsel, hvilket betyder, at udvikleren ikke har meget kontrol over udførelsen af sætningen.
Hvis vi taler om forespørgselsydelse, kan vi ikke gå ud over et omfang med SELECT-INTO-sætning. Lad os se, hvordan vi kan overvinde alle disse mangler ved SELECT-INTO-erklæringen.
I denne blog vil du lære, hvordan du bruger Bulk Collect-klausulen med FETCH-INTO-sætning af en eksplicit markør. Da FETCH-udsagn er en del af markørens livscyklus, kræves et praktisk kendskab til eksplicit markør for bedre forståelse af denne øvelse. For det samme kan du tjekke selvstudiet om, hvordan du opretter en eksplicit markør i Oracle-databasen.
Hvorfor skal vi bruge Bulk Collect-klausul med FETCH INTO-sætning?
Som nævnt i den forrige blog, når vi bruger Bulk-Collect med SELECT-INTO-sætning, bruger runtime-motoren implicit markør til at behandle opgaven. Men hvis vi bruger Bulk Collect med FETCH-INTO-sætning, vil runtime-motoren bruge den eksplicitte markør til at behandle opgaven.
En eksplicit markør hjælper os altid med at få forhåndskontrol over vores standard SQL-forespørgsler. For eksempel med en eksplicit markør kan vi kontrollere, hvornår posterne skal hentes, eller hvor mange poster vi ønsker at hente på én gang, men dette er ikke muligt i tilfælde af SELECT-INTO-sætning.
Hvad er syntaksen for Bulk Collect med Fetch-Into-sætning?
I lighed med SELECT-INTO-sætningen fungerer bulk collect-sætning som en attribut til FETCH-INTO-sætningen. Her er syntaksen
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;
FETCH-udsagn er en del af eksplicit markør. Hvis du prøver at udføre dem uden at angive deres overordnede markør, får du en fejl. Husk også altid, at PL/SQL-samlinger er den eneste understøttede struktur til masseindsamling.
Eksempel:Sådan bruger du PL/SQL Bulk Collect med FETCH-INTO-sætning i Oracle-databasen.
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; /
Jeg har forklaret hver enkelt linje i hele denne kode i detaljer i videotutorialen på min YouTube-kanal. Du kan se denne øvelse.
Da vi i denne kode har brugt Bulk Collect-klausulen med fetch into-sætningen, betyder det, at kontekstskift ikke vil være et problem. Som vi ved, komprimerer bulk collect-klausulen flere switches til en enkelt, så der ikke længere er ydeevne flaskehals.
Men betyder det, at denne kode er godt optimeret og ikke behøver yderligere optimering? Eller for den sags skyld vil forespørgselsydeevne aldrig være et problem for os i fremtiden?
Følg med for at få svar på alle disse spørgsmål samt for at lære, hvordan vi yderligere kan optimere dette PL/SQL-program.
Håber du nød denne blog. Hvis du er i tvivl eller har spørgsmål, eller du tror, jeg har glemt at nævne noget i denne blog, så skriv til mig på min Facebook-side eller Twitter. Tak og god dag!