Колекции Oracle PL / SQL: Променливи, вложени & Индекс по таблици

Съдържание:

Anonim

Какво е колекция?

Колекцията е подредена група от елементи от определени типове данни. Това може да бъде колекция от прост тип данни или сложен тип данни (като дефинирани от потребителя или типове записи).

В колекцията всеки елемент се идентифицира с термин, наречен „индекс“. Всеки елемент от колекцията се присвоява с уникален индекс. Данните в тази колекция могат да бъдат манипулирани или извлечени чрез позоваване на този уникален индекс.

Колекциите са най-полезните неща, когато големи данни от същия тип трябва да бъдат обработени или манипулирани. Колекциите могат да се попълват и манипулират като цяло, като се използва опцията „BULK“ в Oracle.

В този урок ще научите -

  • Какво е колекция?
  • Променливи
  • Вложени таблици
  • Индекс по таблица
  • Конструктор и концепция за инициализация в колекции
  • Методи за събиране

Колекциите са класифицирани въз основа на структурата, индекса и съхранението, както е показано по-долу.

  • Индекс по таблици (известен също като асоциативен масив)
  • Вложени таблици
  • Променливи

Във всеки момент данните в колекцията могат да бъдат посочени с три термина Име на колекция, индекс, име на поле / колона като "<име на колекция> (<подпис>). <Име на колона>". Ще научите за тези гореспоменати категории за събиране по-нататък в раздела по-долу.

Променливи

Varray е метод за събиране, при който размерът на масива е фиксиран. Размерът на масива не може да бъде надвишен от фиксираната му стойност. Индексът на Varray е с числова стойност. Следват атрибутите на Varrays.

  • Размерът на горната граница е фиксиран
  • Попълва се последователно, започвайки с индекс „1“
  • Този тип колекция винаги е плътен, т.е. не можем да изтрием никакви елементи от масив. Вариантът може да бъде изтрит като цяло или може да бъде изрязан от края.
  • Тъй като по природа винаги е гъста, има много по-малка гъвкавост.
  • По-подходящо е да се използва, когато размерът на масива е известен и да се извършват подобни дейности на всички елементи на масива.
  • Индексът и последователността винаги остават стабилни, т.е. индексът и броят на колекцията винаги са едни и същи.
  • Те трябва да бъдат инициализирани, преди да ги използвате в програми. Всяка операция (с изключение на операция EXISTS) върху неинициализирана колекция ще доведе до грешка.
  • Той може да бъде създаден като обект на база данни, който е видим в цялата база данни или вътре в подпрограмата, която може да се използва само в тази подпрограма.

Фигурата по-долу ще обясни схематично разпределението на паметта на Varray (плътна).

Индекс 1 2 3 4 5 6 7
Стойност Xyz Dfv Sde Cxs Vbc Нху Qwe

Синтаксис за VARRAY:

TYPE  IS 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 Ние сме

Синтаксис за вложена таблица:

TYPE  IS TABLE OF ;
  • В горния синтаксис type_name се декларира като колекция от вложени таблици от типа „DATA_TYPE“. Типът данни може да бъде или прост, или сложен тип.

Индекс по таблица

Index-by-table е колекция, в която размерът на масива не е фиксиран. За разлика от другите типове колекции, в колекцията по индекс по таблица индексът може да се състои от потребителя. Следват атрибутите на индекс по таблица.

  • Индексът може на цяло число или низове. По време на създаването на колекцията трябва да се спомене индексният тип.
  • Тези колекции не се съхраняват последователно.
  • Те винаги са оскъдни по природа.
  • Размерът на масива не е фиксиран.
  • Те не могат да се съхраняват в колоната на базата данни. Те се създават и използват във всяка програма в конкретната сесия.
  • Те дават по-голяма гъвкавост по отношение на поддържането на индекс.
  • Индексите също могат да бъдат с отрицателна индексна последователност.
  • Те са по-подходящи за използване за относително по-малки колективни стойности, в които колекцията може да бъде инициализирана и използвана в рамките на същите подпрограми.
  • Не е необходимо те да бъдат инициализирани, преди да започнете да ги използвате.
  • Не може да бъде създаден като обект на база данни. Той може да бъде създаден само в подпрограмата, която може да се използва само в тази подпрограма.
  • BULK COLLECT не може да се използва в този тип колекция, тъй като индексът трябва да бъде даден изрично за всеки запис в колекцията.

Фигурата по-долу ще обясни схематично разпределението на паметта на вложената таблица (оскъдна). Черното оцветено пространство на елементите обозначава празния елемент в колекция, т.е. рядък.

Индекс (varchar) ПЪРВО ВТОРО ТРЕТИ ЧЕТВЪРТА ПЕТО ШЕСТО СЕДМА
Стойност (оскъдна) Qwe Asd Афг Asd Ние сме

Синтаксис за индекс по таблица

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • В горния синтаксис type_name е деклариран като колекция по индекс по таблица от типа „DATA_TYPE“. Типът данни може да бъде или прост, или сложен тип. Променливата subsciprt / index е дадена като тип VARCHAR2 с максимален размер 10.

Конструктор и концепция за инициализация в колекции

Конструкторите са вградената функция, предоставена от оракула, която има същото име като на обекта или колекциите. Те се изпълняват първо, когато обект или колекции се препращат за първи път в сесия. По-долу са важните подробности за конструктора в контекста на колекцията:

  • За колекции тези конструктори трябва да бъдат извикани изрично, за да го инициализират.
  • И двете таблици на Varray и Nested трябва да бъдат инициализирани чрез тези конструктори, преди да бъдат препратени към програмата.
  • Конструкторът имплицитно разширява разпределението на паметта за колекция (с изключение на Varray), следователно конструкторът може също да присвоява променливите на колекциите.
  • Присвояването на стойности на колекцията чрез конструктори никога няма да направи колекцията оскъдна.

Методи за събиране

Oracle предоставя много функции за манипулиране и работа с колекциите. Тези функции са много полезни в програмата за определяне и модифициране на различния атрибут на колекциите. Следващата таблица ще даде различните функции и тяхното описание.

Метод Описание СИНТАКСИС
СЪЩЕСТВУВА (n) Този метод ще върне булеви резултати. Той ще върне „TRUE“, ако n -ият елемент съществува в тази колекция, в противен случай ще върне FALSE. Само функции EXISTS могат да се използват в неинициализирана колекция .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----------------------------------------------