pl sql collections nested table
Научете основите на PL SQL колекции, методи за събиране, Varray, вложена таблица и асоциативен масив с помощта на примери за код:
В PL / SQL подпрограми урок на PL / SQL серия , научихме за процедурите и функциите, различните методи за предаване на параметри и как да създадем / изтрием процедури и функции в PL / SQL.
В тази статия ще обсъдим PL SQL колекциите и свързаните с тях концепции. Ще обясним и концепцията за променливи, вложени таблици и таблици за индексиране, които са налични в PL / SQL.
Освен това ще разгледаме някои от вградените изключения и методи за събиране.
Какво ще научите:
- PL SQL колекции
- Вложени таблици в PL / SQL
- Асоциативен масив или таблици за индексиране
- Променливи в PL / SQL
- Заключение
PL SQL колекции
Колекцията е група от елементи от хомогенни типове данни. Обикновено включва масиви, списъци, набори и т.н. Всеки от елементите има определен индекс, който отразява неговата позиция.
PL SQL колекциите са от следните типове:
- Асоциативен масив / таблици по индекс
- Вложени таблици.
- Променливи.
PL SQL колекциите обикновено се използват за съхранение и манипулиране на големи парчета данни, като се използва ключовата дума BULK COLLECT в Oracle.
Методи за събиране
Pl / SQL има някои вградени методи за събиране, които са изброени по-долу.
Сл. Не. | Име | Описания |
---|---|---|
7 | следващ (m) | Дава индекса, който е след mth индекс. |
1 | броя | Дава броя на елементите, присъстващи в колекцията. |
две | граница | Проверява размера на колекцията. |
3 | съществува (m) | Връща true, ако mth елемент, присъстващ в колекцията else, връща false. |
4 | първо | Дава начален индексен номер в колекцията с целочислен индекс. |
5 | последен | Дава номер на краен индекс в колекцията с целочислен индекс. |
6 | разшири | Добавя NULL елемент към края на колекцията. |
8 | предишен (м) | Дава индекса, предшестващ m индекс. |
9 | подстригване | Изтрива елемент от края на колекцията. |
10 | подстригване (m) | Изтрива m елемента от края на колекцията. |
единадесет | Изтрий | Изтрива всички елементи от колекцията, като броят на настройките е 0. |
12 | изтриване (m) | Изтрива mth елемент от колекцията, ако mth елемент е NULL, тогава не се извършва действие. |
13 | изтриване (m, k) | Изтрива елемент от mth в kth позиция. |
14. | удължи (m) | Добавя m елемент към края на колекцията. |
петнадесет | удължи (m, k) | Добавя m копия на k-тия елемент в края на колекцията. |
Изключения на колекцията
Някои от общите изключения на колекцията са както следва:
- VALUE_ERROR: Това изключение се изхвърля, ако индексът не може да бъде преобразуван в типа ключ или е NULL. Това изключение обикновено се повдига, ако ключът е от тип PLS_INTEGER диапазон и индексът е извън този диапазон.
- NO_DATA_FOUND: Това изключение се изхвърля от PL / SQL, ако или операторът SELECT не извлича редове, или програмата сочи към елемент, който се изтрива в вложена таблица. Това изключение може да бъде повдигнато и от елемент, който е неинициализиран в индексирана таблица.
- COLLECTION_IS_NULL: Това изключение се изхвърля от PL / SQL, ако колекцията е NULL по подразбиране.
- SUBSCRIPT_BEYOND_COUNT: Това изключение се изхвърля, когато индексът е повече от общия брой на елементите в колекцията.
- АБОНАМЕНТИРАНЕ_OUTSIDE_LIMIT: Това изключение се изхвърля, когато индексът е извън обхвата на прага.
Вложени таблици в PL / SQL
Вложените таблици са като таблица с база данни с единична колона или едноизмерен масив, където размерът на масива е динамичен. Индексът му е от числов тип. Можем да получим вложената таблица в променлива, като дадем на редовете индекс, който започва с 1. Тази функция я прави подобна по природа като масив.
Вложена таблица може да се съхранява в колона на база данни. Може да се използва и за манипулиране на SQL операции чрез обединяване на таблици. Тъй като е като динамичен масив, така че горната граница може да бъде с всякакъв размер.
Вложената таблица може да има както плътни, така и оскъдни характеристики на събиране, което означава, че всеки елемент може да бъде изтрит произволно (правейки го оскъден) с помощта на процедурата DELETE. Изтриването на данни причинява прекъсване в индекса, но функцията NEXT помага за итерация към следващите индекси. Тъй като данните се съхраняват под формата на таблица, те могат да бъдат извлечени с помощта на оператори SELECT.
Вложена таблица може да бъде изградена на ниво схема или в PL / SQL блок. Това е като обект на база данни, който е достъпен в базата данни или подпрограмата.
Разликите между масива и вложената таблица са изброени по-долу:
- Размерът на вложените таблици може да се увеличава динамично. Горната граница на масив е фиксирана, но не е фиксирана за вложени таблици.
- Масивът има последователни индекси, което го прави плътен. Вложената таблица обаче е плътна по време на създаването, но става оскъдна, след като елементите бъдат изтрити между тях.
Синтаксис на вложената таблица:
TYPE <> IS TABLE OF <> [NOT NULL];
Тук, 'Тип' е спецификаторът на типа. ‘Елемент’ е типът данни.
Внедряване на код с вложената таблица:
DECLARE TYPE subject IS TABLE OF VARCHAR(15); TYPE teacher IS TABLE OF VARCHAR2(20); subjectnames subject; subjectteacher teacher; summ integer; BEGIN -- adding subject and its teachers to the table subjectnames := subject('PLSQL', 'SELENIUM', 'JMETER'); subjectteacher:= teacher('Sashi', 'Mala', 'Mukund'); -- returns count of number of elements in nested table summ:= subjectteacher.count; -- printing the content to the console dbms_output.put_line('Total Number of Teachers: '|| summ); FOR i IN 1 .. summ LOOP dbms_output.put_line('Subject:'||subjectnames(i)||', Teacher:' || subjectteacher(i)); end loop; END;
Резултатът от горния код трябва да бъде:
Асоциативен масив или таблици за индексиране
Таблицата за индексиране обикновено се нарича асоциативен масив. По отношение на структурата, както таблицата с индекс по, така и вложените таблици са сходни и имат индекс за достъп до елементите.
Асоциативен масив е представен от двойка ключ-стойност. Всеки от уникалните ключове се използва за идентифициране на стойността в масива. Типът данни на ключа може да бъде низ или цяло число, дефинирано при създаването му. Ключът се добавя към таблицата за индексиране чрез просто присвояване на стойност за първи път. За да модифицираме същия запис, трябва да използваме същия ключ.
Ключът трябва да бъде уникален или като първичен ключ в таблица, или чрез комбиниране на низове заедно, за да се развие уникална стойност. Този тип колекция има размер на масива, който е динамичен и има или оскъдни или плътни характеристики. Една разлика между индексираната таблица и вложената таблица е, че първата не може да се съхранява в колоната на базата данни, но вложената таблица може да се съхранява.
Асоциативните масиви осигуряват лесна поддръжка на индекс и се създават в PL / SQL блок. Това е като SQL таблица, където стойностите се получават с помощта на първичния ключ. Това обикновено се използва за временно съхранение на данни и може да се използва вместо SQL таблици за избягване на мрежовия трафик и дисковото съхранение, изисквани от SQL таблиците.
Тъй като асоциативните масиви не съхраняват постоянни данни, те не могат да се използват с SQL изрази като SELECT и INSERT. Те обаче могат да бъдат направени безкрайни за сесия на базата данни, като декларират техния тип данни като пакет и ги дефинират в тялото на пакета.
Синтаксис на индексиращата таблица:
TYPE type IS TABLE OF element [NOT NULL] INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size)]; INDEX BY key;
Ето, „Ключ“ е числово. Тя може да бъде BINARY_INTEGER или PLS_INTEGER. Неговият тип данни може да бъде varchar, varchar2, long или string. Ключът, базиран на varchar, трябва да се споменава с дължина.
‘Елемент’ е типът данни.
‘Размер’ е максималният брой елементи. Това е положително цяло число.
'Тип' е спецификаторът на типа.
Внедряване на код с таблица за индексиране:
DECLARE TYPE age IS TABLE OF NUMBER INDEX BY VARCHAR(25); age_empl age; employee VARCHAR(25); BEGIN -- adding employee details to the table age_empl('Sam') := 30; age_empl('Venu') := 35; -- printing the table contents in the console employee := age_empl.FIRST; WHILE employee IS NOT null LOOP dbms_output.put_line ('Employee name is ' || employee || ' and age is ' || TO_CHAR(age_empl(employee))); employee := age_empl.NEXT(employee); END LOOP; END; /
Резултатът от горния код трябва да бъде:
Променливи в PL / SQL
Varrays съхраняват фиксиран брой елементи и са като едномерен масив. Броят на елементите обаче може да бъде модифициран по време на изпълнение. Това е последователен набор от елементи от подобни типове данни. Той може да се съхранява в таблица на базата данни, която може да се обработва с помощта на SQL изрази. Но процесът не е толкова лесен и гъвкав, колкото в вложената таблица.
Максималният размер на Varray е дефиниран в неговата дефиниция на типа. Той има едно след друго подреждане на паметта, започващо с 1 индекс и адресът с най-ниско местоположение сочи към началния елемент, а адресът с най-високо местоположение сочи към крайния елемент. Всички елементи на Varray се идентифицират с индекс.
Този тип колекция има цифров индекс и има плътни характеристики. По този начин елементите на масива не могат да бъдат изтрити между тях. Или целият Varray трябва да бъде изтрит, или краят му може да бъде изрязан. Поради плътните си характеристики, той има по-малка гъвкавост на използване.
Варият може да бъде създаден или в PL / SQL блок, или на ниво схема. Той се третира като обект на база данни, който може да бъде достъпен в базата данни или в рамките на подпрограма. Варият се използва по-често, когато размерът на масива ни е известен. Той трябва да бъде инициализиран преди използването им и може да бъде инициализиран с помощта на конструктор. Стойността му е NULL, когато е декларирана и трябва да бъде инициализирана, преди да се направи препратка към нейните елементи.
Синтаксис на Varray:
TYPE <> IS VARYING ARRAY (<>) OF <> [NOT NULL];
Тук,
'Тип' е спецификаторът на типа.
‘Елемент’ е типът данни.
‘Размер’ е максималният брой елементи в масив. Това е положително цяло число.
Декларация и инициализация на променливи на вариации
След създаването на Varray можем да го декларираме по начина, описан по-долу:
Синтаксис:
name type_n [:= type_n(...)];
Тук,
‘Име’ е името на Varray.
‘Type_n’ е типът Varray.
‘Type_n (…)’ е конструкторът от тип Varray. Списъците с аргументи се споменават чрез разделител на запетая и от тип Varray.
Трябва да инициализираме променлива на Varray, преди да я използваме, иначе тя дава неинициализирана грешка при събиране. Инициализацията се извършва по начина, описан по-долу.
Синтаксис:
name type_n := type_n();
Това ще инициализира променливата с нулеви елементи. За да попълните елементи в променливите на варианта, синтаксисът е:
name type_n := type_n(e1, e2, ...);
Достъп до елементи от масив
Елементите могат да бъдат достъпни чрез описания по-долу процес:
име (m); където m е индексът на елементите, който започва с 1 и завършва с максималния брой на елементите от тип Varray. В случай, че m надхвърля диапазона 1 и максималния брой на елементите, SUBSCRIPT_BEYOND_COUNT изключение е хвърлено от PL / SQL.
Размерът на Varray може да се променя с помощта на израза ALTER.
Прилагане на код с ALTER.
CREATE Or REPLACE TYPE names AS VARRAY(2) OF VARCHAR(5); /
Резултатът от горния код трябва да бъде.
как да създадете списък
Прилагане на код с Varray:
DECLARE type countrynames IS VARRAY(3) OF VARCHAR2(50); type currency IS VARRAY(3) OF VARCHAR2(15); country countrynames; cur currency; addition integer; BEGIN -- adding country and its currency to the table country := countrynames('INDIA', 'USA', 'UK'); cur:= currency('INR', 'DOLLAR', 'POUND'); -- returns count of number of countries in varray addition := country.count; -- printing the content to the console dbms_output.put_line('Total Number of countries : '|| addition); FOR i in 1 .. addition LOOP dbms_output.put_line('Country: ' || country(i) || ' ,Currency : ' || cur(i)); END LOOP; END; /
Резултатът от горния код трябва да бъде:
Разлики между променливите и вложените таблици
Разликите са както следва:
- Докато работим по сценарий, при който броят на елементите е известен и те са подредени последователно, обикновено се използват променливи. Varray, който се съхранява в база данни, поддържа своите индекси и последователност. Той винаги се поддържа като един обект. Докато вложените таблици се използват, когато броят на елементите не е ограничен.
- Вложената таблица има оскъдни характеристики, които й позволяват да премахва всеки елемент от всяка позиция и не винаги от края. Редът и индексът на вложена таблица не се поддържат, когато тя се съхранява в базата данни. Елементите на Varray винаги се поддържат в последователност.
Разлики между асоциативни масиви и вложени таблици
Разликите са както следва:
- Вложените таблици могат да се съхраняват в колона на базата данни, но асоциативните масиви не са. Вложените таблици поддържат правилни връзки с данни, които се съхраняват постоянно.
- Асоциативните масиви са добри за малки справочни таблици, където колекцията може да бъде вградена в паметта всеки път, когато се инициализира пакет или се извика процедура. Те са добър избор, когато размерът не е известен предварително. Стойностите на индекса на асоциативен масив са гъвкави, тъй като индексите на този масив не са в последователност или могат да бъдат отрицателни или низ вместо число.
Често задавани въпроси и отговори
В # 1) Защо използваме колекции в PL / SQL?
Отговор: Има три типа колекции - вложени таблици, асоциативни масиви и променливи. Вложените таблици могат да съхраняват произволен брой елементи. Променливите могат да съхраняват фиксиран брой елементи, а асоциативните масиви ни позволяват да търсим елементи с произволни числа и низове.
В # 2) Какво представлява вложената таблица в PL / SQL?
Отговор: Вложената таблица е едномерна по своя характер и нейният размер не остава фиксиран. Те могат да бъдат достъпни в SQL и PL / SQL блокове. Може да се използва в записи, дефиниции на обекти и таблици.
В # 3) Какво представлява общото събиране в Oracle PL / SQL?
Отговор: Груповото събиране е метод за получаване на данни, когато PL / SQL механизмът информира SQL механизма да натрупва няколко реда едновременно и да ги съхранява в колекция.
В # 4) Защо груповото събиране е по-бързо в Oracle?
Отговор: Груповото събиране подобрява производителността, като намалява взаимодействието между PL / SQL двигателя и базата данни.
В # 5) Какво представлява Varray в PL / SQL?
Отговор: Това е PL / SQL структура на данни, която се използва за съхраняване на хомогенна колекция от елементи от същия тип данни в последователност. Използва се най-вече за съхраняване на подреден набор от данни.
В # 6) Можем ли да изтрием елемент от Varray в Oracle?
Отговор: Не можем да модифицираме или изтриваме елементи в Varray с помощта на SQL изрази директно. Трябва да изберем Varray от таблицата, да го модифицираме в PL / SQL и след това да модифицираме таблицата и да я съхраним в нов Varray.
В # 7) Каква е разликата между вложената таблица и варианта?
Отговор: Разликите са изброени по-долу:
- Вземаме Varray, когато броят на елементите е известен от преди. Това ограничение не е възможно в вложени таблици.
- Във Varray елементите се използват последователно. Вложената таблица има както плътни, така и оскъдни характеристики.
- Елементите винаги са подредени във Varray. Елементите могат или не могат да бъдат в ред в вложената таблица.
Заключение
В този урок обсъдихме подробно някои от основните концепции на PL / SQL, които са от съществено значение за развиването на знания за него.
Покрихме следните теми, изброени по-долу:
- Основно разбиране на PL SQL колекции (методи и изключения).
- Променливи.
- Вложени таблици
- Индексиращи таблици
<< PREV Tutorial | СЛЕДВАЩ Урок >>
Препоръчително четене
- Типове данни за масив - int масив, двоен масив, масив от низове и т.н.
- Java Array - Как да отпечатвате елементи от масив в Java?
- PL SQL Урок за начинаещи с примери | Какво е PL / SQL
- Java Array - Декларирайте, създайте и инициализирайте масив в Java
- Урок за дължина на масив Java с примери за кодове
- SQL срещу NoSQL Точни разлики и знайте кога да използвате NoSQL и SQL
- Разлика между SQL Vs MySQL Vs SQL Server (с примери)
- JUnit 5 Вложен клас: @Nested Урок с примери