Oracle
 sql >> база данни >  >> RDS >> Oracle

Методи за събиране:FIRST &LAST функции в Oracle Database

Добре дошли отново в поредицата за методите за събиране в базата данни на 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 точно както направихме в горния пример.

Сега въпросът еа ако ОТРЕЖЕМ колекцията? Какъв ще бъде резултатът от функцията за събиране ПОСЛЕДНО? Продължете и разгледайте видеоурока където обясних какъв ще бъде резултатът от метода за събиране ПОСЛЕДНО, когато изрежете колекцията с помощта на примера.

Това е всичко за тези методи за събиране. Надявам се, че сте намерили този блог полезен. Благодаря и приятен ден!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlplus изявление от командния ред

  2. Присъединяване на вложен цикъл в Oracle 11g

  3. Как да напиша параметризирана заявка за вмъкване на оракул?

  4. Как да изчисля размера на таблиците в Oracle

  5. Завъртане на таблица в SQL (т.е. кръстосана табулация / кръстосана таблица)