Hromadné shromažďování klauzule s výpisem NAČÍST DO
V předchozím tutoriálu se nám podařilo zkomprimovat více kontextových přepínačů do jednoho pomocí PL/SQL Bulk Collect s příkazem SELECT-INTO. Příkaz SELECT-INTO je standardní dotaz SQL, což znamená, že vývojář nemá moc kontroly nad provedením příkazu.
Pokud mluvíme o výkonu dotazu, nemůžeme jít nad rámec příkazu SELECT-INTO. Podívejme se, jak můžeme překonat všechny tyto nedostatky příkazu SELECT-INTO.
V tomto blogu se dozvíte, jak používat klauzuli Bulk Collect s příkazem FETCH-INTO explicitního kurzoru. Protože příkazy FETCH jsou součástí životního cyklu kurzoru, je pro lepší pochopení tohoto kurzu vyžadována pracovní znalost explicitního kurzoru. Stejně tak se můžete podívat na tutoriál o tom, jak vytvořit explicitní kurzor v databázi Oracle.
Proč bychom měli používat klauzuli Bulk Collect s příkazem FETCH INTO?
Jak bylo zmíněno v předchozím blogu, kdykoli použijeme Bulk-Collect s příkazem SELECT-INTO, runtime modul používá ke zpracování úlohy implicitní kurzor. Pokud ale použijeme Bulk Collect s příkazem FETCH-INTO, pak runtime modul použije ke zpracování úlohy explicitní kurzor.
Explicitní kurzor nám vždy pomáhá získat předběžnou kontrolu nad našimi standardními SQL dotazy. Například pomocí explicitního kurzoru můžeme ovládat, kdy načíst záznamy nebo kolik záznamů chceme načíst najednou, to však není možné v případě příkazu SELECT-INTO.
Jaká je syntaxe příkazu Bulk Collect with Fetch-Into?
Podobně jako u příkazu SELECT-INTO funguje klauzule hromadného sběru jako atribut příkazu FETCH-INTO. Zde je syntaxe
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;
Příkazy FETCH jsou součástí explicitního kurzoru. Pokud se je pokusíte spustit bez deklarování jejich nadřazeného kurzoru, dostanete chybu. Vždy si také pamatujte, že kolekce PL/SQL jsou jedinou podporovanou strukturou pro hromadné shromažďování.
Příklad:Jak používat PL/SQL Bulk Collect s příkazem FETCH-INTO v databázi Oracle.
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; /
Každý jednotlivý řádek celého tohoto kódu jsem podrobně vysvětlil ve výukovém videu na mém kanálu YouTube. Můžete se podívat na tento tutoriál.
Protože jsme v tomto kódu použili klauzuli Bulk Collect s příkazem načíst do, znamená to, že přepínání kontextu nebude problém. Jak víme, klauzule hromadného shromažďování komprimuje několik přepínačů do jednoho, takže žádné další omezení výkonu.
Znamená to ale, že tento kód je dobře optimalizovaný a nepotřebuje další optimalizaci? Nebo když na to přijde, výkon dotazu pro nás nebude nikdy v budoucnu problémem?
Zůstaňte naladěni, abyste získali odpovědi na všechny tyto otázky a také se dozvěděli, jak můžeme dále optimalizovat tento PL/SQL program.
Doufám, že se vám tento blog líbil. Pokud máte nějaké pochybnosti nebo otázky nebo si myslíte, že jsem v tomto blogu něco zapomněl zmínit, napište mi na moji stránku na Facebooku nebo Twitteru. Děkuji a přeji hezký den!