Hromadné zpracování dat pomocí příkazu FORALL
Vím, že předchozí návod byl rychlým odpočinkem od naší série Bulk Collect. Přece jen to bylo žádané publikem a my jsme měli povinnost to splnit. Ale nebojte se, jsme zpět na správné cestě. Pojďme se tedy podívat na úvod do příkazu hromadného zpracování dat pomocí FORALL v databázi Oracle.
V případě, že nevíte, o jakém tutoriálu mluvím, podívejte se sem. Tak a teď pojďme k tématu.
Co je to FORALL prohlášení?
Příkaz FORALL pomáhá zpracovávat hromadná data optimalizovaným způsobem odesíláním příkazů DML nebo příkazu MERGE (pokud používáte 11g nebo vyšší) v dávkách z PL/SQL enginu do SQL enginu.
Příkaz FORALL můžete také definovat jako konstrukci hromadné smyčky, která provede příkaz DML nebo příkaz MERGE jednou nebo vícekrát najednou.
Hromadné shromažďování optimalizuje dotaz a zvyšuje výkon omezením přepínání kontextu. FORALL dělá totéž pro příkazy DML, jako je Insert, Delete, Update nebo pro příkaz MERGE.
Jaká je syntaxe příkazu FORALL?
Syntaxe je docela jednoduchá, pojďme se na to podívat.
FORALL index IN bound_clauses [SAVE EXCEPTION] DML statement;
Kde:
FORALL je klíčové slovo Oracle Reserved.
Index je implicitně definovaný čítač smyček, který je deklarován PL/SQL enginem jako PLS_INTEGER. Protože je implicitně definován PL/SQL enginem, nemusíte jej definovat. Rozsah Indexu je omezen na příkaz FORALL, ve kterém je definován.
Bound_Clauses jsou klauzule, které řídí počet iterací smyčky. Také hodnota indexu je na něm závislá. V Oracle PL/SQL existují tři typy vázaných klauzulí, o kterých budeme diskutovat samostatně později v tomto tutoriálu.
ULOŽIT VÝJIMKU je volitelná volba, která udržuje příkaz FORALL spuštěný, i když příkaz DML způsobí výjimku. Tyto výjimky jsou uloženy v atributu kurzoru s názvem SQL%Bulk_Exceptions.
Informace:
Vzhledem k SAVE EXCEPTION příkaz FORALL neukončí náhle, i když existuje výjimka. Toto je výhoda příkazu FORALL oproti smyčce FOR.
Prohlášení DML :Příkaz DML může být jakýkoli příkaz DML jako INSERT, UPDATE nebo DELETE. Pokud používáte Oracle 11g nebo vyšší, můžete také použít příkaz MERGE s FORALL. Musíte se však ujistit, že váš příkaz DML nebo příkaz MERGE musí odkazovat alespoň na jednu kolekci v klauzuli VALUES nebo WHERE.
Navíc na rozdíl od smyčky FOR, s příkazem FORALL můžeme použít pouze jeden DML najednou. Toto je nedostatek FORALL.
Je FORALL smyčka jako FOR Loop?
Ne, ačkoli příkaz FORALL iteruje všechny řádky kolekce, nejedná se však o smyčku FOR. Pokud jste pozorně sledovali syntaxi, pak jste si museli všimnout, že na rozdíl od „FOR Loop“ blok příkazu FORALL nezačíná klíčovým slovem LOOP ani nekončí klíčovým slovem END LOOP.
Můžeme spustit Insert and Update DML najednou pomocí FORALL?
Ne, bohužel na rozdíl od FOR Loop s FORALL nemůžeme spustit více než jeden DML najednou. To znamená, že můžete buď provést vložení nebo aktualizaci najednou, nikoli obě současně. To je nedostatek příkazu FORALL.
Co je atribut kurzoru SQL%Bulk_Exceptions?
Atribut kurzoru SQL%Bulk_Exceptions je kolekce záznamů, která má dvě pole Error_Index a Error_Code. Error_Index ukládá počet iterací příkazu FORALL, v jejichž průběhu došlo k výjimce. Na druhou stranu Error_Code ukládá kód výjimky, který odpovídá vyvolané výjimce.
Můžeme vidět počet výjimek, ke kterým došlo během provádění příkazu FORALL?
Pomocí SQL%BULK_EXCEPTION.COUNT můžete snadno zkontrolovat, kolik výjimek bylo vyvoláno během provádění příkazu FORALL.
Co jsou to vázané klauzule? Řekněte nám o nich něco.
Jak bylo uvedeno výše, vázané klauzule řídí hodnotu indexu smyčky a počet iterací příkazu FORALL. Existují tři typy vázaných klauzulí, které lze použít s příkazem FORALL v databázi Oracle. Jsou to:
- Dolní a horní hranice
- Indexy a
- Hodnoty
Dolní a horní hranice :Podobně jako u FOR LOOP musíte v této vázané klauzuli zadat platný začátek a konec po sobě jdoucích indexových čísel odkazované kolekce.
Je nutné zadat platný rozsah po sobě jdoucích indexových čísel spolu s touto vázanou klauzulí pro počet kolekcí, na které se odkazuje v příkazu DML. Existuje však možnost chyby, pokud se zjistí, že kolekce, na kterou se odkazuje tato klauzule, je řídká. Chyba, kterou dostanete, je tato:
ORA-22160: element at index [3] does not exist
V případě, že je vaše odkazovaná sbírka řídká a používáte Oracle 10g nebo vyšší, možná budete chtít použít další dvě možnosti, kterými jsou „Indexy-of“ a „Values-of“.
INDICES OF :Druhá vázaná klauzule, kterou máme k dispozici, je „Indexy“. Tato vázaná klauzule umožňuje našemu příkazu FORALL procházet řídkou sbírkou, jako je asociativní pole nebo vnořená tabulka.
Doporučená četba:Úvod do kolekce PL/SQL
HODNOTY :Třetí vázaná klauzule je Values of. Volba VALUES OF objasňuje, že hodnoty prvků zadané kolekce čítače smyček jsou základem hodnot v příkazu FORALL. Tato kolekce je v zásadě skupinou indexů, kterými může příkaz FORALL procházet. Kromě toho tyto indexy nemusí být jedinečné, stejně jako mohou být uvedeny v libovolném pořadí.
V případě, že se budete učit rychleji sledováním video tutoriálu, pak zde je jedno podrobně vysvětlující prohlášení FORALL.
V budoucích tutoriálech se naučíme, jak používat všechny tyto vázané klauzule s příkazem FORALL, takže zůstaňte naladěni. Pro nejnovější aktualizace se můžete přihlásit k odběru mého kanálu YouTube a sledovat mě na mých sociálních sítích.
Děkuji a přeji hezký den!