Групова обработка на данни с помощта на изявление FORALL
Знам, че предишният урок беше бърза почивка от нашата серия Bulk Collect. Все пак това беше исканото от публиката и ние имахме задължение да го изпълним. Но не се притеснявайте, ние се връщаме на пътя. Така че нека видим въведението в груповата обработка на данни с помощта на оператор FORALL в Oracle Database.
В случай, че не знаете за какъв урок говоря, проверете тук. Така че сега да преминем към темата.
Какво е изявление FORALL?
Инструкцията FORALL помага да се обработват групови данни по оптимизиран начин чрез изпращане на DML оператори или оператор MERGE (ако използвате 11g или по-висок) в пакети от PL/SQL машина към SQL машина.
Можете също така да дефинирате оператор FORALL като конструкция на групов цикъл, която изпълнява DML оператор или оператор MERGE един път или няколко пъти наведнъж.
Груповото събиране оптимизира заявката и повишава производителността чрез намаляване на превключвателите на контекста. FORALL прави същото за DML изрази като Insert, Delete, Update или за оператор MERGE.
Какъв е синтаксисът на оператора FORALL?
Синтаксисът е доста прост, нека да разгледаме.
FORALL index IN bound_clauses [SAVE EXCEPTION] DML statement;
Къде:
ЗАВСЕ е запазената ключова дума на Oracle.
Индекс е имплицитно дефиниран брояч на цикъла, който е деклариран от PL/SQL машината като PLS_INTEGER. Тъй като е имплицитно дефиниран от PL/SQL двигателя, не е необходимо да го дефинирате. Обхватът на Index е ограничен до оператора FORALL, в който е дефиниран.
Свързани_клаузи са клаузите, които контролират броя на итерациите на цикъла. Също така стойността на индекса също зависи от него. Има три типа обвързани клаузи в Oracle PL/SQL, които ще обсъдим отделно по-късно в този урок.
ЗАПАЗЕТЕ ИЗКЛЮЧЕНИЕ е незадължителен избор, който поддържа оператора FORALL да работи дори когато DML изразът причинява изключение. Тези изключения се записват в атрибут на курсора, наречен SQL%Bulk_Exceptions.
Информация:
Поради SAVE EXCEPTION, операторът FORALL не излиза внезапно, дори когато има изключение. Това е предимство на оператора FORALL пред цикъла FOR.
DML изявление :DML изразът може да бъде всеки DML израз като INSERT, UPDATE или DELETE. Ако използвате Oracle 11g или по-нова версия, можете също да използвате оператор MERGE с FORALL. Но трябва да се уверите, че вашият DML израз или операторът MERGE трябва да препраща към поне една колекция в клаузата VALUES или WHERE.
Освен това за разлика от цикъла FOR, с израза FORALL можем да използваме само един DML в даден момент. Това е недостатъкът на FORALL.
FORALL цикъл като FOR ли е?
Не, въпреки че операторът FORALL итерира през всички редове на колекция, но не е цикъл FOR. Ако сте видели внимателно синтаксиса, тогава сигурно сте забелязали, че за разлика от ‘FOR Loop’ блокът на оператора FORALL нито започва с ключовата дума LOOP, нито завършва с ключовата дума END LOOP.
Можем ли да изпълним Insert и Update DML наведнъж с помощта на FORALL?
Не, за съжаление За разлика от цикъла FOR с FORALL не можем да изпълняваме повече от един DML наведнъж. Това означава, че можете да изпълните Insert или Update едновременно, а не и двете заедно. Това е недостатък на изявлението FORALL.
Какво представлява атрибутът на курсора SQL%Bulk_Exceptions?
Атрибутът на курсора SQL%Bulk_Exceptions е колекция от записи, която има две полета Error_Index и Error_Code. Error_Index съхранява броя итерации на оператора FORALL, в хода на които е възникнало изключението. От друга страна Error_Code съхранява кода на изключение, който съответства на повдигнатото изключение.
Можем ли да видим броя на изключенията, възникнали по време на изпълнението на оператора FORALL?
Можете лесно да проверите колко изключения са били повдигнати по време на изпълнението на оператора FORALL, като използвате SQL%BULK_EXCEPTION.COUNT.
Какви са тези обвързани клаузи? Разкажете ни нещо за тях.
Както бе споменато по-горе, Bound клаузите контролират стойността на индекса на цикъла и броя на повторенията на оператора FORALL. Има три типа обвързани клаузи, които могат да се използват с израза FORALL в Oracle Database. Това са:
- Долна и горна граница
- Индекси на и
- Стойности на
ДОЛНАТА И ГОРНАТА граница :Подобно на FOR LOOP, в тази обвързана клауза трябва да посочите валидното начало и край на последователните индексни номера на посочената колекция.
Задължително е да посочите валиден диапазон от последователни индексни номера заедно с тази обвързана клауза за броя на колекциите, посочени в оператора DML. Въпреки това съществува вероятност от грешка, ако колекцията, която е посочена с тази клауза, се окаже рядка. Грешката, която ще получите, е следната:
ORA-22160: element at index [3] does not exist
В случай, че посочената ви колекция е рядка и използвате Oracle 10g или по-нова версия, тогава може да искате да използвате другите две опции, които са „Индекси на“ и „Стойности на“.
ИНДЕКСИТЕ НА :Втората обвързана клауза, която е достъпна за нас, е „Индекси на“. Тази обвързана клауза позволява на нашия израз FORALL да преминава през рядка колекция, като например асоциативен масив или вложена таблица.
Препоръчителна литература:Въведение в колекцията PL/SQL
СТОЙНОСТИТЕ НА :Третата обвързана клауза е Стойности на. Опцията VALUES OF ясно показва, че стойностите на елементите от посочената колекция на брояча на цикъла са в основата на стойностите в оператора FORALL. По принцип тази колекция е група от индекси, през които операторът FORALL може да премине. Освен това, тези индекси не трябва да са уникални, както и могат да бъдат изброени в произволен ред.
В случай, че научите по-бързо, като гледате видеоурок, ето едно, обясняващо подробно изявлението FORALL.
Ще се научим как да използваме всички тези обвързани клаузи с оператора FORALL в бъдещите уроци, така че следете. За най-новата актуализация можете да се абонирате за моя канал в YouTube и да ме последвате в социалните ми медии.
Благодаря и приятен ден!