Какво е колекция?
Колекцията е подредена група от елементи от определени типове данни. Това може да бъде колекция от прост тип данни или сложен тип данни (като дефинирани от потребителя или типове записи).
В колекцията всеки елемент се идентифицира с термин, наречен „индекс“. Всеки елемент от колекцията се присвоява с уникален индекс. Данните в тази колекция могат да бъдат манипулирани или извлечени чрез позоваване на този уникален индекс.
Колекциите са най-полезните неща, когато големи данни от същия тип трябва да бъдат обработени или манипулирани. Колекциите могат да се попълват и манипулират като цяло, като се използва опцията „BULK“ в Oracle.
В този урок ще научите -
- Какво е колекция?
- Променливи
- Вложени таблици
- Индекс по таблица
- Конструктор и концепция за инициализация в колекции
- Методи за събиране
Колекциите са класифицирани въз основа на структурата, индекса и съхранението, както е показано по-долу.
- Индекс по таблици (известен също като асоциативен масив)
- Вложени таблици
- Променливи
Във всеки момент данните в колекцията могат да бъдат посочени с три термина Име на колекция, индекс, име на поле / колона като "<име на колекция> (<подпис>). <Име на колона>". Ще научите за тези гореспоменати категории за събиране по-нататък в раздела по-долу.
Променливи
Varray е метод за събиране, при който размерът на масива е фиксиран. Размерът на масива не може да бъде надвишен от фиксираната му стойност. Индексът на Varray е с числова стойност. Следват атрибутите на Varrays.
- Размерът на горната граница е фиксиран
- Попълва се последователно, започвайки с индекс „1“
- Този тип колекция винаги е плътен, т.е. не можем да изтрием никакви елементи от масив. Вариантът може да бъде изтрит като цяло или може да бъде изрязан от края.
- Тъй като по природа винаги е гъста, има много по-малка гъвкавост.
- По-подходящо е да се използва, когато размерът на масива е известен и да се извършват подобни дейности на всички елементи на масива.
- Индексът и последователността винаги остават стабилни, т.е. индексът и броят на колекцията винаги са едни и същи.
- Те трябва да бъдат инициализирани, преди да ги използвате в програми. Всяка операция (с изключение на операция EXISTS) върху неинициализирана колекция ще доведе до грешка.
- Той може да бъде създаден като обект на база данни, който е видим в цялата база данни или вътре в подпрограмата, която може да се използва само в тази подпрограма.
Фигурата по-долу ще обясни схематично разпределението на паметта на Varray (плътна).
Индекс | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Стойност | Xyz | Dfv | Sde | Cxs | Vbc | Нху | Qwe |
Синтаксис за VARRAY:
TYPEIS VARRAY ( ) OF ;
- В горния синтаксис type_name се декларира като VARRAY от типа „DATA_TYPE“ за дадената граница на размера. Типът данни може да бъде или прост, или сложен тип.
Вложени таблици
Вложената таблица е колекция, в която размерът на масива не е фиксиран. Има числов тип индекс. По-долу има още описания за типа вложена таблица.
- Вложената таблица няма горна граница на размера.
- Тъй като горната граница на размера не е фиксирана, колекцията, паметта трябва да се удължава всеки път, преди да я използваме. Можем да разширим колекцията, използвайки ключовата дума „EXTEND“.
- Попълва се последователно, започвайки с индекс „1“.
- Този тип колекция може да бъде както плътен, така и оскъден , т.е. можем да създадем колекцията като плътна и можем също така да изтрием произволен елемент от масив на случаен принцип, което го прави като оскъден.
- Той дава по-голяма гъвкавост по отношение на изтриването на елемента масив.
- Той се съхранява в генерираната от системата таблица на базата данни и може да се използва в заявката за избор за извличане на стойностите.
- Индексът и последователността не са стабилни, т.е. индексът и броят на елемента на масива могат да варират.
- Те трябва да бъдат инициализирани, преди да ги използвате в програми. Всяка операция (с изключение на операция EXISTS) върху неинициализираната колекция ще доведе до грешка.
- Той може да бъде създаден като обект на база данни, който е видим в цялата база данни или вътре в подпрограмата, която може да се използва само в тази подпрограма.
Фигурата по-долу ще обясни схематично разпределението на паметта на вложената таблица (плътна и оскъдна). Черното оцветено пространство на елементите обозначава празния елемент в колекция, т.е. рядък.
Индекс | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Стойност (плътна) | Xyz | Dfv | Sde | Cxs | Vbc | Нху | Qwe |
Стойност (оскъдна) | Qwe | Asd | Афг | Asd | Ние сме |
Синтаксис за вложена таблица:
TYPEIS TABLE OF ;
- В горния синтаксис type_name се декларира като колекция от вложени таблици от типа „DATA_TYPE“. Типът данни може да бъде или прост, или сложен тип.
Индекс по таблица
Index-by-table е колекция, в която размерът на масива не е фиксиран. За разлика от другите типове колекции, в колекцията по индекс по таблица индексът може да се състои от потребителя. Следват атрибутите на индекс по таблица.
- Индексът може на цяло число или низове. По време на създаването на колекцията трябва да се спомене индексният тип.
- Тези колекции не се съхраняват последователно.
- Те винаги са оскъдни по природа.
- Размерът на масива не е фиксиран.
- Те не могат да се съхраняват в колоната на базата данни. Те се създават и използват във всяка програма в конкретната сесия.
- Те дават по-голяма гъвкавост по отношение на поддържането на индекс.
- Индексите също могат да бъдат с отрицателна индексна последователност.
- Те са по-подходящи за използване за относително по-малки колективни стойности, в които колекцията може да бъде инициализирана и използвана в рамките на същите подпрограми.
- Не е необходимо те да бъдат инициализирани, преди да започнете да ги използвате.
- Не може да бъде създаден като обект на база данни. Той може да бъде създаден само в подпрограмата, която може да се използва само в тази подпрограма.
- BULK COLLECT не може да се използва в този тип колекция, тъй като индексът трябва да бъде даден изрично за всеки запис в колекцията.
Фигурата по-долу ще обясни схематично разпределението на паметта на вложената таблица (оскъдна). Черното оцветено пространство на елементите обозначава празния елемент в колекция, т.е. рядък.
Индекс (varchar) | ПЪРВО | ВТОРО | ТРЕТИ | ЧЕТВЪРТА | ПЕТО | ШЕСТО | СЕДМА |
Стойност (оскъдна) | Qwe | Asd | Афг | Asd | Ние сме |
Синтаксис за индекс по таблица
TYPEIS TABLE OF INDEX BY VARCHAR2 (10);
- В горния синтаксис type_name е деклариран като колекция по индекс по таблица от типа „DATA_TYPE“. Типът данни може да бъде или прост, или сложен тип. Променливата subsciprt / index е дадена като тип VARCHAR2 с максимален размер 10.
Конструктор и концепция за инициализация в колекции
Конструкторите са вградената функция, предоставена от оракула, която има същото име като на обекта или колекциите. Те се изпълняват първо, когато обект или колекции се препращат за първи път в сесия. По-долу са важните подробности за конструктора в контекста на колекцията:
- За колекции тези конструктори трябва да бъдат извикани изрично, за да го инициализират.
- И двете таблици на Varray и Nested трябва да бъдат инициализирани чрез тези конструктори, преди да бъдат препратени към програмата.
- Конструкторът имплицитно разширява разпределението на паметта за колекция (с изключение на Varray), следователно конструкторът може също да присвоява променливите на колекциите.
- Присвояването на стойности на колекцията чрез конструктори никога няма да направи колекцията оскъдна.
Методи за събиране
Oracle предоставя много функции за манипулиране и работа с колекциите. Тези функции са много полезни в програмата за определяне и модифициране на различния атрибут на колекциите. Следващата таблица ще даде различните функции и тяхното описание.
Метод | Описание | СИНТАКСИС |
СЪЩЕСТВУВА (n) | Този метод ще върне булеви резултати. Той ще върне „TRUE“, ако n -ият елемент съществува в тази колекция, в противен случай ще върне FALSE. Само функции EXISTS могат да се използват в неинициализирана колекция | |
БРОЯ | Дава общия брой на елементите, присъстващи в колекция | <име на колекция> .COUNT |
ГРАНИЦА | Той връща максималния размер на колекцията. За Varray той ще върне фиксирания размер, който е дефиниран. За вложена таблица и индекс по таблица, тя дава NULL | <име на колекция> .LIMIT |
ПЪРВО | Връща стойността на първата променлива на индекса (индекс) на колекциите | <име на колекция> .ПЪРВО |
ПОСЛЕДНО | Връща стойността на последната индексна променлива (индекс) на колекциите | <име на колекция> .LAST |
ПРЕДИШЕН (n) | Връща преди променливата на индекса в колекция от n -ия елемент. Ако няма предшестваща стойност на индекса, се връща NULL | <име на колекция> .PRIOR (n) |
СЛЕДВАЩ (n) | Връща променливата индекс успешно в колекция от n -ия елемент. Ако няма успех, се връща стойност на индекса NULL | <име_на колекция> .СЛЕДВАЩ (n) |
РАЗШИРИ | Разширява един елемент в колекция в края | <име на колекция> .EXTEND |
EXTEND (n) | Разширява n елемента в края на колекция | <име на колекция> .EXTEND (n) |
EXTEND (n, i) | Удължава n копия на i -ия елемент в края на колекцията | <име на колекция> .EXTEND (n, i) |
TRIM | Премахва един елемент от края на колекцията | <име на колекция> .TRIM |
TRIM (n) | Премахва n елемента от края на колекцията | <име на колекция> .TRIM (n) |
ИЗТРИЙ | Изтрива всички елементи от колекцията. Прави колекцията празна | <име на колекция> .DELETE |
ИЗТРИВАНЕ (n) | Изтрива n-ия елемент от колекцията. Ако n -ият елемент е NULL, това няма да направи нищо | <име на колекция> .DELETE (n) |
ИЗТРИВАНЕ (m, n) | Изтрива елемента в диапазона от m -то до n -то в колекцията | <име на колекция> .DELETE (m, n) |
Пример1: Тип запис на ниво подпрограма
В този пример ще видим как да попълним колекцията с помощта на „BULK COLLECT“ и как да препратим данните за колекцията.
DECLARETYPE emp_det IS RECORD(EMP_NO NUMBER,EMP_NAME VARCHAR2(150),MANAGER NUMBER,SALARY NUMBER);TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl();BEGININSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);COMMIT:SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no);dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name);dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary);dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);dbms_output.put_line('--------------------------------');END LOOP;END;/
Обяснение на кода:
- Кодов ред 2-8 : Типът запис 'emp_det' се декларира с колони emp_no, emp_name, заплата и мениджър от тип данни НОМЕР, VARCHAR2, НОМЕР, НОМЕР.
- Кодов ред 9: Създаване на колекцията 'emp_det_tbl' от елемент тип запис 'emp_det'
- Кодов ред 10: Деклариране на променливата 'guru99_emp_rec' като тип 'emp_det_tbl' и инициализиране с нулев конструктор.
- Кодов ред 12-15: Вмъкване на примерни данни в таблицата „emp“.
- Код ред 16: Фиксиране на транзакцията за вмъкване.
- Кодов ред 17: Извличане на записите от таблицата 'emp' и попълване на променливата за събиране като групово с помощта на командата „BULK COLLECT“ Сега променливата 'guru99_emp_rec' съдържа всички записи, които присъстват в таблицата 'emp'.
- Кодов ред 19-26: Задаване на цикъл „ЗА“, използвайки за отпечатване на всички записи в колекцията един по един. Методът за събиране FIRST и LAST се използва като долна и по-висока граница на цикъла.
Изход : Както можете да видите на горната екранна снимка, когато горният код се изпълни, ще получите следния изход
Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------