В этой главе мы обсудим массивы в PL / SQL. Язык программирования PL / SQL предоставляет структуру данных, называемую VARRAY , которая может хранить последовательную коллекцию элементов одного типа с фиксированным размером. Varray используется для хранения упорядоченного набора данных, однако часто лучше рассматривать массив как набор переменных одного типа.
Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему.
Массив является частью данных типа коллекции и обозначает массивы переменного размера. Мы будем изучать другие типы коллекций в следующей главе «Коллекции PL / SQL» .
Каждый элемент в массиве имеет индекс, связанный с ним. Он также имеет максимальный размер, который можно динамически изменять.
Создание типа Varray
Тип varray создается с помощью оператора CREATE TYPE . Вы должны указать максимальный размер и тип элементов, хранящихся в varray.
Основной синтаксис для создания типа VARRAY на уровне схемы —
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
Куда,
- varray_type_name является допустимым именем атрибута,
- n — количество элементов (максимум) в массиве,
- element_type — это тип данных элементов массива.
Максимальный размер varray можно изменить с помощью инструкции ALTER TYPE .
Например,
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10); / Type created.
Основной синтаксис для создания типа VARRAY в блоке PL / SQL:
TYPE varray_type_name IS VARRAY(n) of <element_type>
Например —
TYPE namearray IS VARRAY(5) OF VARCHAR2(10); Type grades IS VARRAY(5) OF INTEGER;
Давайте теперь потренируемся на нескольких примерах, чтобы понять концепцию —
Пример 1
Следующая программа иллюстрирует использование varrays —
DECLARE type namesarray IS VARRAY(5) OF VARCHAR2(10); type grades IS VARRAY(5) OF INTEGER; names namesarray; marks grades; total integer; BEGIN names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); marks:= grades(98, 97, 78, 87, 92); total := names.count; dbms_output.put_line('Total '|| total || ' Students'); FOR i in 1 .. total LOOP dbms_output.put_line('Student: ' || names(i) || ' Marks: ' || marks(i)); END LOOP; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Total 5 Students Student: Kavita Marks: 98 Student: Pritam Marks: 97 Student: Ayan Marks: 78 Student: Rishav Marks: 87 Student: Aziz Marks: 92 PL/SQL procedure successfully completed.
Пожалуйста, обратите внимание —
-
В среде Oracle начальный индекс для varrays всегда равен 1.
-
Вы можете инициализировать элементы varray, используя метод конструктора типа varray, имя которого совпадает с именем varray.
-
Varrays — это одномерные массивы.
-
Varray автоматически становится NULL, когда он объявлен, и должен быть инициализирован, прежде чем на его элементы можно будет ссылаться.
В среде Oracle начальный индекс для varrays всегда равен 1.
Вы можете инициализировать элементы varray, используя метод конструктора типа varray, имя которого совпадает с именем varray.
Varrays — это одномерные массивы.
Varray автоматически становится NULL, когда он объявлен, и должен быть инициализирован, прежде чем на его элементы можно будет ссылаться.
Пример 2
Элементами varray также может быть% ROWTYPE любой таблицы базы данных или% TYPE любого поля таблицы базы данных. Следующий пример иллюстрирует концепцию.
Мы будем использовать таблицу CUSTOMERS, хранящуюся в нашей базе данных, как —
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
В следующем примере используется курсор , который вы подробно изучите в отдельной главе.
DECLARE CURSOR c_customers is SELECT name FROM customers; type c_list is varray (6) of customers.name%type; name_list c_list := c_list(); counter integer :=0; BEGIN FOR n IN c_customers LOOP counter := counter + 1; name_list.extend; name_list(counter) := n.name; dbms_output.put_line('Customer('||counter ||'):'||name_list(counter)); END LOOP; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —