Защо изявление FORALL с клауза INDICES OF BIND?
Изявлението FORALL с клауза за долна и горна граница е може би най-лесният начин за групова обработка на данни, докато не се позоваваме на плътна колекция. Когато става въпрос за рядко събиране, клаузата за долна и горна граница не е силна. Освен това, за съжаление, в реалния живот шансовете за работа с плътна колекция са много по-ниски, отколкото при работа с рядка колекция.
Както и да е, ако сте любопитни, тогава направихме демонстрация. Вижте какво се случва, когато използваме клауза за долна и горна граница на израза FORALL с оскъдна колекция във видеоклипа в нашия YouTube канал тук.
Недостатъкът на клаузата за долна и горна граница на оператора FORALL е, че не може да се използва с рядка колекция. Този недостатък може лесно да бъде преодолян с помощта на опции като „Индекси на “ или „Стойности на “ обвързана клауза. Този урок е изцяло за първата опция.
Клауза INDICES-OF Bound
Подобно на клаузата за долна и горна граница, клаузата INDICES-OF ни помага при обработката на масивни данни, като ни позволява да итерираме през колекцията. Единствената разлика е, че с помощта на клауза INDICES OF можем да итерираме както през плътна, така и през рядка колекция. Докато клаузата за долна и горна граница работи само с плътна колекция.
Синтаксис на обвързана клауза INDICES OF
FORALL index IN INDICES OF collection_variable [SAVE EXCEPTION] DML statements;
Къде:
ЗАВСЕ е запазена ключова дума от Oracle Database, последвана от индекс. Този индекс е имплицитно дефиниран брояч на цикъла, който е деклариран от PL/SQL машината. След това трябва да напишете друга ключова дума, която е IN. Следвана от ключова дума IN имаме нашата обвързана клауза, която е INDICES OF.
Веднага след написването на запазената фраза „INDICES OF“ трябва да посочим колекцията на колекцията, чиито данни искаме да използваме. Вече знаем, че сме посочили колекцията в програмата чрез нейната колекция променлива. След това имаме опция ЗАПАЗВАНЕ ИЗКЛЮЧЕНИЕ, това е по избор. Тогава имаме DML израз, това може да бъде произволен DML оператор или оператор MERGE.
Уверете се, че операторът DML или операторът MERGE, който използвате с FORALL, трябва да препраща към колекция. Също така оператор FORALL може да обработва само един DML или оператор MERGE наведнъж.
Пример за обвързана клауза INDICES OF
Тук ще видим демонстрация на обвързаната клауза INDICES OF с оператор FORALL. Тук ще извлечем данните от вече инициализирана разредена вложена таблица и ще ги съхраним в таблица.
Както научихме в предишния урок, операторът FORALL взема данните от колекцията и ги съхранява в таблица. Така първо ще създадем таблица.
SET SERVEROUTPUT ON; CREATE TABLE tut_78( mul_tab NUMBER(5) );
За да направим демонстрацията лесна, създадохме много проста таблица с име tut_78. Тази таблица има само една колона mul_tab от NUMBER тип данни.
DECLARE TYPE my_nested_table IS TABLE OF number; var_nt my_nested_table := my_nested_table (9,18,27,36,45,54,63,72,81,90); --Another variable for holding total number of record stored into the table tot_rec NUMBER; BEGIN var_nt.DELETE(3, 6); FORALL idx IN INDICES OF var_nt INSERT INTO tut_78 (mul_tab) VALUES (var_nt(idx)); SELECT COUNT (*) INTO tot_rec FROM tut_78; DBMS_OUTPUT.PUT_LINE ('Total records inserted are '||tot_rec); END; /
Можете да намерите подробното обяснение на горния код във видео урока. Но все пак нека да имаме кратко обяснение и тук.
Раздел за декларация на горния PL/SQL блок
Тук в този раздел за първи път създадохме вложена таблица с името „my_nested_table ’. Съдържа данните от NUMBER тип данни. След това декларирахме неговата колекция променлива „var_nt ’. Използвайки го, инициализирахме първите 10 индекса, като съхранихме 10 числови елемента в нашата колекция.
Освен вложена таблица и нейната колекция, ние също така декларирахме допълнителна променлива „tot_rec ’ от числови тип данни. Тази променлива ще се използва за съхраняване на общия брой данни, които ще бъдат съхранени в таблицата.
Раздел за изпълнение
Ако погледнете първия израз в раздела за изпълнение. Ще откриете, че използвайки метода за събиране DELETE, изтрих данни от индекс 3 до индекс 6. Това означава, че сега индексът на нашата колекция не се попълва последователно. Това променя естеството на нашата колекция от DENSE до РЕДКОСТ
Веднага след извикването на метода за събиране DELETE имаме нашия оператор FORALL с INDICES OF bound клауза. Използвайки това изявление, ние вмъкваме в колекцията „my_nested_table“ в таблицата tut_78.
Тогава имаме израз SELECT-INTO. Този израз връща общия брой редове, вмъкнати в таблицата tut_78 и съхранява тази стойност в променливата tot_rec. След това, използвайки оператора DBMS_OUTPUT, ние показваме обратно стойността, съхранена в променливата tot_rec, с форматиран низ на потребителя.
Силно ви препоръчвам да гледате този урок в моя канал в YouTube за задълбочено обяснение на дискутирания по-горе код. Също така, не забравяйте да се абонирате за канала за още интересни уроци.
Благодаря, това е урок за PL/SQL за това как да извършвате групова обработка на данни с помощта на оператор FORALL с клауза INDICES OF bound. Надяваме се, че ви е харесало да четете, ако е така, споделете този блог във вашите социални медии. Приятен ден!