sql >> Databáze >  >> RDS >> Oracle

Jak používat klauzuli hromadného sběru s příkazem SELECT INTO v databázi Oracle

Hromadné shromáždění doložky s příkazem SELECT INTO

Vítejte u druhého tutoriálu v sérii PL/SQL Bulk Collect, kde se naučíme, jak používat klauzuli BULK COLLECT s příkazem SELECT-INTO.

Kontextové přepínače jsou dobré, ale pouze v případě, že jsou nízké. Zvýšený počet přepínání kontextu může způsobit problémy, jako je například špatný výkon dotazů. Tuto režii způsobenou přepínáním kontextu lze snadno ovládat, pokud je dokážeme komprimovat. To je přesně to, co se dozvíte v tomto výukovém programu.

Další informace o SELECT-INTO zde .

Kdy bychom měli použít Hromadný sběr s příkazem Select-Into?

Když jste si jisti, že výsledek vašeho příkazu SELECT je malý pak byste měli použít klauzuli Bulk Collect s příkazem Select-Into. V opačném případě vaše klauzule o hromadném shromažďování způsobí, že vaše prohlášení Select-Into bude vzrušující monstrum. Následně to zpomalí výkon vaší databáze.

Co mám dělat, když můj příkaz SELECT načítá velké množství řádků?

K omezení počtu řádků načtených z databáze můžete vždy použít klauzuli LIMIT spolu s hromadným sběrem. Ale to je možné pouze tehdy, když používáme klauzuli Bulk Collect s PL/SQL kurzory. Nicméně o tom budeme podrobně diskutovat v příštím tutoriálu.

Proč nemůžeme omezit data načítaná pomocí Bulk Collect v příkazu SELECT-INTO?

Když používáme klauzuli Bulk Collect s příkazem SELECT-INTO, používá se implicitní kurzor k provedení úkolu hromadného zpracování dat. Klauzuli omezení však lze použít pouze s klauzulí hromadného sběru, pokud tato používá Explicitní kurzor pro zpracování dat.

Kdy doložka o hromadném shromažďování používá implicitní kurzor a kdy explicitní kurzor?

Pokud používáme klauzuli Bulk Collect s příkazem SQL, jako je SELECT-INTO, používá implicitní kurzor. Na druhou stranu, kdykoli použijeme klauzuli Bulk Collect s příkazem FETCH, použije se explicitní kurzor.

Doporučuji vám přečíst jak vytvořit explicitní kurzor se dozvíte více o příkazu FETCH.

Můžeme uložit výsledek vrácený klauzulí hromadného sběru do proměnné primitivního datového typu?

Ne, v současnosti jsou kolekce PL/SQL jedinými podpůrnými datovými typy pro hromadné zpracování dat s doložkou Bulk Collect v Oracle Database. V případě, že se pokusíte uložit data získaná pomocí klauzule Bulk Collect do proměnné datového typu, jako je Char, Number nebo Varchar2, zobrazí se chyba, která bude číst přibližně takto:

“PLS-00497:V seznamu INTO nelze kombinovat jeden řádek a více řádků (BULK)”

Definice hromadného sběru do výpisu
Příkaz „Bulk Collect Into“ vybere více dat ze sloupce a uloží je do kolekce SQL.

Syntaxe klauzule Bulk Collect s příkazem Select-Into.

Syntaxe pro použití klauzule hromadného sběru PL/SQL s příkazem Select-Into v databázi Oracle je následující:

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

Kde:

Seznam sloupců je seznam sloupců, ze kterých chcete načíst data.

Název datového typu sbírky bude název proměnné kolekce, která bude obsahovat data vrácená klauzulí hromadného shromažďování.

Kromě toho si vždy pamatujte, že každý sloupec, který jste zadali pro načtení dat, musí nést odpovídající datový typ kolekce pro uložení těchto dat. Protože runtime modul PL/SQL vždy ukládá data získaná ze sloupce do kolekce paralelně.

Například

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

Zde se data načtená ze sloupce_1 automaticky uloží do kolekce_1 a data ze sloupce_2 do kolekce_2.

Název tabulky může být název libovolné tabulky, ze které chcete načíst data.

Následuje klauzule WHERE a ORDER BY, které jsou volitelné, ale pokud chcete, můžete je použít.

Nyní, když jsme probrali syntaxi, udělejme jednoduchý příklad, abychom se naučili pracovat s klauzulí PL/SQL Bulk Collect pomocí příkazu SELECT INTO v databázi Oracle.

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;
/

Vysvětlení příkladu

Zde máme velmi jednoduchý kód, který demonstruje, jak používat klauzuli Bulk Collect s příkazem Select-Into. V deklarační části tohoto kódu jsme nejprve vytvořili dvě kolekce typu Nested Table „nt_fName“ &„nt_lName“ s jejich odpovídajícími proměnnými kolekce „fName“ &„lName“. Ve skutečnosti budou obě tyto kolekce použity k uchování dat vrácených příkazem Select-Into.

Jak vytvořit vnořenou tabulku si můžete přečíst zde.

V sekci prohlášení máme náš příkaz Select-Into s klauzulí Bulk Collect. Navíc pomocí tohoto příkazu Select-Into získáváme všechna data ze sloupce Jméno a Příjmení v tabulce zaměstnanců. A s pomocí klauzule Bulk Collect tato data ukládáme do odpovídajících kolekcí paralelně.

Kromě společně s příkazem Select-Into máme také „For Loop“ což je tisk dat obou kolekcí na výstupní obrazovku.

Musíte sledovat
Nezapomeňte se podívat na video, kde jsem ukázal, jak klauzule Bulk Collect komprimuje více kontextových přepínačů do jednoho a zlepšuje výkon dotazu. Tady je odkaz.

Toto je výukový program podrobně vysvětlující koncepty klauzule Bulk Collect s příkazem Select-Into. V tomto tutoriálu jsem se pokusil zodpovědět všechny možné otázky, se kterými se můžete setkat při certifikační zkoušce i při pohovoru.

Doufám, že se vám čtení líbilo. Nezapomeňte prosím SDÍLET tento blog se svými přáteli na své sociální síti. Děkuji a přeji hezký den!


  1. Oracle SQL GROUP BY není nápověda k výrazu GROUP BY

  2. Výhody vs. nevýhody implementace prostředí hybridního cloudu

  3. je možné vybrat přímo EXISTS jako bit?

  4. Implementace nastavení více datových center pro PostgreSQL – část druhá