Клауза за групово събиране с изявление FETCH INTO
В предишния урок успяхме да компресираме множество превключватели на контекст в един, като използвахме PL/SQL Bulk Collect с оператор SELECT-INTO. Инструкцията SELECT-INTO е стандартна SQL заявка, което означава, че разработчикът няма голям контрол върху изпълнението на израза.
Ако говорим за производителност на заявката, не можем да надхвърлим екстент с израза SELECT-INTO. Нека видим как можем да преодолеем всички тези недостатъци на оператора SELECT-INTO.
В този блог ще научите как да използвате клауза Bulk Collect с израз FETCH-INTO на изричен курсор. Тъй като операторите FETCH са част от жизнения цикъл на курсора, така че за по-доброто разбиране на този урок са необходими работни познания за изричния курсор. За същото можете да разгледате урока как да създадете изричен курсор в базата данни на Oracle.
Защо трябва да използваме клауза за групово събиране с оператор FETCH INTO?
Както беше споменато в предишния блог, когато използваме Bulk-Collect с израза SELECT-INTO, машината за изпълнение използва имплицитен курсор за обработка на задачата. Но ако използваме Bulk Collect с израза FETCH-INTO, тогава машината по време на изпълнение ще използва изричния курсор, за да обработи задачата.
Изричният курсор винаги ни помага да получим предварителен контрол върху нашите стандартни SQL заявки. Например с изричен курсор можем да контролираме кога да извлечем записите или колко записа искаме да извлечем наведнъж, но това не е възможно в случай на оператор SELECT-INTO.
Какъв е синтаксисът на израза за групово събиране с извличане?
Подобно на израза SELECT-INTO, клаузата за групово събиране работи като атрибут на оператора FETCH-INTO. Ето синтаксиса
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;
Изявленията FETCH са част от изричния курсор. Ако се опитате да ги изпълните без да декларирате родителския им курсор, ще получите грешка. Също така винаги помнете, че PL/SQL колекциите са единствената поддържана структура за групово събиране.
Пример:Как да използвате PL/SQL групово събиране с израз FETCH-INTO в Oracle Database.
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; /
Обясних подробно всеки ред от целия този код във видео урока в моя канал в YouTube. Можете да гледате този урок.
Тъй като в този код сме използвали клауза Bulk Collect с оператора за извличане, това означава, че превключването на контекста няма да бъде проблем. Както знаем, клаузата за групово събиране компресира множество превключватели в един, така че няма по-нататъшно гърло на производителността.
Но означава ли това, че този код е добре оптимизиран и не се нуждае от допълнителна оптимизация? Или по този въпрос ефективността на заявките никога няма да бъде проблем за нас в бъдеще?
Останете на линия, за да получите отговорите на всички тези въпроси, както и да научите как можем допълнително да оптимизираме тази PL/SQL програма.
Надявам се, че сте харесали този блог. Ако имате някакви съмнения или въпроси или смятате, че съм забравил да спомена нещо в този блог, пишете ми на моята Facebook страница или Twitter. Благодаря и приятен ден!