Добре дошли отново в поредицата за методите за събиране в базата данни на Oracle. Досега в тази серия разгледахме броя на функцията за събиране ( ) и съществуването на функцията за събиране ( ). Надявам се, че ви е харесало четенето. Днес в този урок за PL/SQL ще научим методите за събиране First ( ) и Last ( ).
Какви са методите за събиране ПЪРВО ( ) и ПОСЛЕДНО ( )?
Използваме функции за колекция First &Last, за да знаем първата и последната стойност на индекса, дефинирани в колекция.
Можем ли да използваме тези методи за събиране с всякакъв тип събиране?
Да! Можете да използвате и двете функции с трите типа колекции, които са асоциативен масив, вложена таблица и VARRAY.
Кога методът за събиране FIRST ( ) и LAST ( ) връща нула?
И двете функции връщат null, когато се прилагат към празна колекция или когато се прилагат към инициализираща колекция, която няма елементи.
Можете ли да посочите спецификацията на функциите и за двете функции?
Сигурен! Защо не. Спецификацията за функцията за събиране FIRST ( ) е:
FUNCTION FIRST RETURN PLS_INTEGER | VARCHAR2
И спецификацията на функцията за функция за събиране LAST ( ) е:
FUNCTION LAST RETURN PLS_INTEGER | VARCHAR2
Информация:
За асоциативен масив с индексиран низ тези методи връщат низове; „най-ниско“ и „най-високо“ се определят от подредбата на набора от знаци, използван в тази сесия.
Ами ако има само 1 елемент в моя VARRAY?
В този случай функцията за събиране FIRST ( ) винаги е 1, а методът за събиране LAST ( ) винаги е равен на COUNT.
Ами ако приложа тези функции към неинициализирана колекция?
Сериозно искам да кажа, защо го правиш! Както и да е, ако сте приложили функцията за събиране FIRST &LAST към неинициализирана колекция, това ще предизвика COLLECTION_IS_NULL изключение.
Пример:Как да използвам функцията за събиране ПЪРВО и ПОСЛЕДНО с колекция?
SET SERVEROUTPUT ON; DECLARE TYPE nt_tab IS TABLE OF NUMBER; col_var nt_tab := nt_tab(10, 20, 30, 40, 50); BEGIN DBMS_OUTPUT.PUT_LINE ('First Index of the Nested table is ' || col_var.FIRST); DBMS_OUTPUT.PUT_LINE ('Last Index of the Nested table is ' || col_var.LAST); END; /
В горния пример създадохме вложена таблица с името NT_TAB и я инициализирахме с помощта на колекция променлива col_var. Тази вложена таблица има 5 индекса, в които сме съхранили стойностите. Най-ниският индекс в тази вложена таблица е 1, който съдържа стойност 10, а максималният индекс е 5 със стойност 50. Така при изпълнение резултатът от първия DBMS_OUTPUT ще бъде 1, а от втория оператор DBMS_OUTPUT ще бъде 5.
Продължете, копирайте кода и проверете сами резултата.
Ами ако изтрием първия елемент от вложената таблица? Какъв ще бъде резултатът от функцията за събиране ПЪРВО?
Това е много добър въпрос! Ако изтриете първия елемент от функцията за събиране, тогава функцията за събиране FIRST ще върне индекса, който е по-голям от 1 и съдържа някои данни. Нека видим примера:
SET SERVEROUTPUT ON; DECLARE TYPE nt_tab IS TABLE OF NUMBER; col_var nt_tab := nt_tab(10, 20, 30, 40, 50); BEGIN col_var.DELETE(1); DBMS_OUTPUT.PUT_LINE ('First Index after DELETE is ' || col_var.FIRST); END; /
В горния пример изтрихме първия елемент от вложената таблица nt_tab, използвайки метода за събиране DELETE. След изтриване на първия елемент, който е 10 на индекс 1, новият най-нисък индекс вече е 2, който има някои данни, съхранени в него. Така при изпълнение резултатът ще бъде 2.
Ами ако изтрия елемента от средата на колекцията?
Ако изтриете данните от средата, тогава функцията за събиране LAST ще върне стойност, която е по-голяма от стойността, върната от метода COUNT.
Можем ли да видим данните, съхранени в индексите на колекцията, използвайки FIRST и LAST методите за събиране?
Когато обяснявах същата концепция в клас, една ученичка вдигна ръка и ме попита.
Сър, досега виждаме, че тези функции връщат индексния номер на колекцията. Ами ако искаме да видим данните, съхранени в този индекс. Има ли начин да видите данните, съхранени в индекса, като използвате тези методи за събиране ПЪРВО И ПОСЛЕДНО?
Отговорът на този въпрос е,да! Разбира сета . Заедно с индексния номер можете да използвате тези функции, за да видите данните, съхранявани в най-ниския и най-високия индекс на колекцията.
Например
SET SERVEROUTPUT ON; DECLARE TYPE nt_tab IS TABLE OF NUMBER; col_var nt_tab := nt_tab(10, 20, 30, 40, 50); BEGIN -- This output statement will return 10 which is the value stored at the first index DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.FIRST)); -- This output statement will return 50 which is the value stored at the last index DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.LAST)); END; /
За да видите данните, съхранени в първия и последния индекс, просто трябва да поставите извикванията на функциите на тези функции в скобите на колекция променлива, която е col_var точно както направихме в горния пример.
Сега въпросът еа ако ОТРЕЖЕМ колекцията? Какъв ще бъде резултатът от функцията за събиране ПОСЛЕДНО? Продължете и разгледайте видеоурока където обясних какъв ще бъде резултатът от метода за събиране ПОСЛЕДНО, когато изрежете колекцията с помощта на примера.
Това е всичко за тези методи за събиране. Надявам се, че сте намерили този блог полезен. Благодаря и приятен ден!