Както видяхме във въведението в методите за събиране на PL/SQL, има 7 функции за събиране в Oracle Database. Сред тези седем функции вече научихме първите пет метода. Prior и Next са последните два метода/функции за събиране на PL/SQL, които все още остават за изследване.
Така в днешния PL/SQL блог ще разгледаме подробно тези два недокоснати метода за събиране.
Какво представляват функциите за предишно и следващо събиране?
Винаги е добре да имате някои функции под ръкава си, които могат да ви помогнат да се ориентирате в съдържанието на вашата колекция. Функцията Предишна и Следваща може да са тези функции.
И двете функции приемат индекс на колекцията като вход и връщат резултата.
Например методът за събиране на PL/SQL PRIOR приема индекс като вход и връща стойността, съхранена в предишния най-нисък индекс. Докато методът за събиране NEXT връща стойността от следващия по-висок индекс.
Предишно и следващо събиране ли са функции или процедури?
И преди, и следващ са функции.
Можем ли да използваме и двете функции и с трите типа колекции?
Да, функциите за предишна и следваща колекции могат да се използват и с трите типа колекции.
Кога методите за събиране на PL/SQL преди и следващия ще върнат нула?
Методът за събиране Prior връща null, когато няма налични по-ниски индексни стойности, а методът за събиране Next връща null, когато няма налични стойности с по-висок индекс за връщане.
С прости думи можем да кажем, че и двете функции за събиране връщат Null, ако се използват съответно с първия и последния индекс на колекция .
Какъв ще бъде резултатът от методите за събиране Next и Prior, ако ги използваме с асоциативен масив?
Ако методите за събиране PRIOR и NEXT се използват с асоциативни масиви, тогава те ще върнат изход от тип данни VARCHAR2 или LONG.
Чувал съм, че тези методи предизвикват някакъв вид изключение. Вярно ли е?
Да, това е вярно. Ако някоя от тези функции се приложи към неинициализирана вложена таблица или променлива, тогава те повдигат изключението COLLECTION_IS_NULL.
Можете ли да ни демонстрирате как да използваме тези функции в нашия код?
Разбира се, защо не! Ще ви покажа прилагането на функциите за събиране както преди, така и след това с помощта на много лесен код.
Пример за метод за събиране преди.
В този метод ще научим как да използваме метода за събиране преди с вложена таблица.
SET SERVEROUTPUT ON; 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); BEGIN dbms_output.put_line('Index prior to index 3 is '||var_nt.PRIOR(3)); dbms_output.put_line('Value before 3rd Index is '||var_nt(var_nt.PRIOR(3))); END; /
В горния анонимен PL/SQL блок имаме два изходни оператора с „Предишно извикване на функция“. Първият изходен оператор ще върне номера на индекса преди номер на индекса 3, който има някаква стойност, съхранена в него. В нашия случай индексът преди индекс номер 3 е 2. Така 2 ще бъде изходът на първия изходен оператор.
Във втория изходен израз извикахме функцията Prior и я предоставихме като вход към обекта за събиране.
var_nt(var_nt.PRIOR(3))
Двигателят на Oracle ще изпълни първо функцията Collection преди (нека я наречем част 1) и използвайки резултата от част 1, след това ще изпълни обекта за събиране (нека го наречем част 2) и ще произведе крайния резултат, който ще бъде 18 в нашия случай. Продължете, копирайте кода и опитайте да се изпълните сами.
Какво ще се случи, ако изтрием предишния най-нисък индекс от вложената таблица?
Така че сега въпросът е какво ще се случи, ако изтриете предишния най-нисък индекс, който е 2 в нашия код. В този случай резултатът определено няма да е същият. Предишната функция връща предишния най-нисък индекс. Но този индекс трябва да съдържа някаква стойност.
Опитайте го сами. Ето кода.
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); BEGIN var_nt.DELETE(2); dbms_output.put_line('Index prior to index 3 is '||var_nt.PRIOR(3)); dbms_output.put_line('Value before 3rd Index is '||var_nt(var_nt.PRIOR(3))); END; /
Пример за метод за събиране След това.
Можете да използвате метода за събиране на PL/SQL Next, както сте използвали функцията Prior в горния код. Методът за събиране NEXT връща стойността от следващия по-висок индекс. Ето примера
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); BEGIN dbms_output.put_line('Next Higher Index to index 3 is '||var_nt.NEXT(3)); dbms_output.put_line('Value after 3rd Index is '||var_nt(var_nt.NEXT(3))); END; /
И двата примера са почти еднакви, с изключение на извикването на функция за събиране. В раздела за изпълнение на този PL/SQL блок отново имаме два изходни оператора. Първият изходен оператор ще върне следващия номер на непразен индекс, докато вторият ще върне данните, съхранени в този индекс. Работата на двете тези твърдения ще бъде същата, както обсъдихме по-горе. Продължете, копирайте кода и вижте изхода.
Това беше подробният урок за метода за събиране на PL/SQL Next и Prior. Надяваме се, че ви е харесало четенето и сте научили нещо ново. Не забравяйте да споделите този блог във вашите социални медии. За да споделите този блог във вашия Facebook, щракнете тук, а за Twitter щракнете тук.
Благодаря и приятен ден!