вторник, 8 ноября 2011 г.

Массивы в PL/SQL

PL/SQL, являясь процедурным расширением языка структурированных запросов SQL, имеет все необходимые составляющие для полнофункционального программирования логики. Ветвления, циклы, массивы и т.д. - все как у людей:) Работа с массивами в PL/SQL, однако, отличается от стандартного для многих распространенных языков программирования подхода.

С массивами, как известно, можно делать три вещи: объявлять массив, добавлять/изменять/читать данные по индексу и обходить массив в цикле. Эти действия мы и рассмотрим.



Определение массива PL/SQL

Для определения массива необходимо описать тип данных в массиве и затем объявить переменную созданного типа:

declare

 TYPE arr_type IS TABLE OF VARCHAR2(128)
 INDEX BY BINARY_INTEGER;

 arr arr_type;

begin
 null;
end;

Таким образом мы определили тип arr_type, являющийся описанием массива. Каждый массив этого типа, как видно из описания, хранит данные типа VARCHAR2(128), то есть строки длиной до 128 символов, используя в качестве ключа массива тип BINARY_INTEGER, то есть целые числа.

Определив тип, мы можем создать массивы этого типа, как показано в примере выше. Переменная arr является массивом типа arr_type.

Работа с элементами массива


Добавляются элементы массива в PL/SQL практически так же, как и в других языках программирования, вместо традиционных квадратных скобок используются круглые:

-- включим вывод данных
SET SERVEROUTPUT ON
DECLARE
 TYPE arr_type IS TABLE OF VARCHAR2(128)
 INDEX BY BINARY_INTEGER;
 arr arr_type;
 str VARCHAR2(500);
begin

-- добавляем элементы в массив
arr(1)  := 'Креслице';
arr(2)  := 'Табуреточка';
arr(-4) := 'Стульчик';
arr(7)  := 'Диванище';

-- присваиваем строковой переменной str значение элемента массива
str := arr(2);

-- выводим значение элемента
DBMS_OUTPUT.put_line('arr(-4) = ' || arr(-4));

end;

В скобках указывается индекс элемента массива. Конечно, индекс должен принадлежать типу индекса для массива - BINARY_INTEGER в нашем случае.

Обход массива в цикле


Массивы тем собственно и хороши, что их можно в цикле обходить:) Вариантов обхода может быть много, некоторые показаны ниже.


SET SERVEROUTPUT ON
DECLARE
 TYPE arr_type IS TABLE OF VARCHAR2(128)
 INDEX BY BINARY_INTEGER;
 arr arr_type;
 cnt BINARY_INTEGER;
begin

arr(1)  := 'Креслице';
arr(2)  := 'Табуреточка';
arr(-4) := 'Стульчик';
arr(7)  := 'Диванище';

-- ОБХОДИМ МАССИВ В ПОРЯДКЕ ПЕРВЫЙ ЭЛЕМЕНТ-ПОСЛЕДНИЙ ЭЛЕМЕНТ

-- начальное значение счетчика цикла - индекс
-- первого элемента массива
cnt := arr.FIRST;

LOOP
 -- выводим текущий элемент
 DBMS_OUTPUT.put_line('Element is: ' || arr(cnt));
 -- условие выхода - равенство счетчика индексу последнего элемента
 EXIT WHEN cnt = arr.LAST;
 -- счетчик устанавливаем на индекс следующего элемента
 cnt := arr.NEXT(cnt);
END LOOP;

-- ОБХОДИМ МАССИВ В ПОРЯДКЕ ПОСЛЕДНИЙ ЭЛЕМЕНТ-ПЕРВЫЙ ЭЛЕМЕНТ

-- начальное значение счетчика цикла - индекс
-- последнего элемента массива
cnt := arr.LAST;

LOOP
 -- выводим текущий элемент
 DBMS_OUTPUT.put_line('Element is: ' || arr(cnt));
 -- условие выхода - равенство счетчика индексу первого элемента
 EXIT WHEN cnt = arr.FIRST;
 -- счетчик устанавливаем на индекс предыдущего элемента
 cnt := arr.PRIOR(cnt);
END LOOP;

end;

Здесь мы использовали несколько методов массивов PL/SQL, приведем их и некоторые другие (первоисточник):

АтрибутВозвращаемый типОписание
COUNTNUMBERВозвращает число строк таблицы.
DELETE-Удаляет строки таблицы.
EXISTSBOOLEANВозвращает TRUE если указанный элемент находится в таблице иначе FALSE.
FIRSTBINARY_INTEGERВозвращает индекс первой строки таблицы.
LASTBINARY_INTEGERВозвращает индекс последней строки таблицы.
NEXTBINARY_INTEGERВозвращает индекс строки таблицы, которая следует за указанной строкой.
PRIORBINARY_INTEGERВозвращает индекс строки таблицы, которая предшествует указанной строке.

Таким образом, обход в цикле реализуется следующим образом в зависимости от порядка обхода элементов:

  1. счетчику цикла присваивается начальное значение, равное индексу первого (или последнего) элемента массива;
  2. в цикле выполняются необходимые действия и происходит проверка, не равен ли счетчик цикла индексу последнего (первого) элемента массива;
  3. в случае равенства цикл останавливается;
  4. в противном случае вычисляет новое значение индекса массива (для следующего или предыдущего элемента) и цикл повторяется.
Вот и вся мат часть работы с PL/SQL массивами. Удачи!

13 комментариев:

  1. Спасибо, Леша) Помог юным программистам)

    ОтветитьУдалить
  2. Спасибо. А есть возможность создавать многомерные массивы?

    ОтветитьУдалить
    Ответы
    1. Можно представлять многомерные массивы в стиле Fortran.

      Удалить
  3. Коротко и делу. Полезная статья для начинающих.

    ОтветитьУдалить
  4. Код автором либо совсем не проверялся, либо правился без проверки.
    В коде вместо a. для исполнения требуется arr.

    ОтветитьУдалить
  5. А что если, какой-то из элементов массива имеет одинаковое значение с последним элементом массива? Не произойдет ли при условии exit when cnt = arr.last не запланированного выхода из цикла?

    ОтветитьУдалить
  6. Консоли от компании Microsoft не сразу захватили всемирную популярность и доверие игроков. Первая консоль под названием Xbox, вышедшая в далеком 2001 году, значительно уступала PlayStation 2 по количеству проданных приставок. Но все поменялось с выходом Xbox 360 - консоли седьмого поколения, которая стала по-настоящему "народной" для обитателей Рф и стран СНГ - Игры для Xbox Series X. Интернет-сайт Ru-Xbox.Ru является популярным ресурсом среди поклонников приставки, так как он предлагает игры для Xbox 360, которые поддерживают все имеющиеся версии прошивок - совершенно бесплатно! Зачем играть на оригинальном железе, в случае если имеется эмуляторы? Для Xbox 360 игры выходили долгое время и находятся как посредственными проектами, так и хитами, многие из которых даже сейчас остаются уникальными для это консоли. Некоторые пользователи, желающие сыграть в игры для Xbox 360, могут задать вопрос: зачем нужны игры для прошитых Xbox 360 freeboot или разными версиями LT, если есть эмулятор? Рабочий эмулятор Xbox 360 хоть и существует, однако он требует производительного ПК, для покупки которого будет нужно вложить существенную сумму. К тому же, разные артефакты в виде исчезающих текстур, отсутствия некоторых графических эффектов и освещения - могут изрядно попортить впечатления об игре и отбить желание для ее предстоящего прохождения. Что предлагает этот интернет-сайт? Наш портал полностью посвящен играм для приставки Xbox 360. У нас можно совсем бесплатно и без регистрации скачать игры на Xbox 360 через торрент для следующих версий прошивок консоли: - FreeBoot; - LT 3.0; - LT 2.0; - LT 1.9. Каждая прошивка имеет свои особенности обхода встроенной защиты. Поэтому, для запуска той либо иной игры потребуется скачать специальную ее версию, которая полностью приспособлена под одну из 4 вышеперечисленных прошивок. На нашем сайте вы можете без усилий подобрать желаемый проект под нужную прошивку, так как возле каждой игры присутствует название версии (FreeBoot, LT 3.0/2.0/1.9), под которую она приспособлена. Гостям данного ресурса доступна особая категория игр для 360-го, созданных для Kinect - специального дополнения, которое считывает все движения 1-го либо нескольких игроков, и позволяет управлять с помощью их компьютерными персонажами. Большой выбор ПО Не считая способности скачать игры на Xbox 360 Freeboot или LT разных версий, здесь можно найти программное обеспечение для консоли от Майкрософт: - современные версии Dashboard, которые позволяют кастомизировать интерфейс консоли под свои нужды, сделав его более комфортным и нынешним; - браузеры; - просмотрщики файлов; - сохранения для игр; - темы для консоли; - программы, для конвертации образов и записи их на диск. Помимо перечисленного выше игры на Xbox 360 Freeboot можно запускать не с дисковых, а с USB и прочих носителей, используя программу x360key, которую можно достать на нашем интернет-сайте. Посетителям доступно огромное количество полезных статей, а также форум, где можно пообщаться с единомышленниками либо попросить совета у более опытнейших хозяев консоли.

    ОтветитьУдалить
  7. Бонусы и поощрений в БК 1хбет существенно повышает привлекательность компании в глазах игроков. Очень выгодные предложения доступны как новичкам, и игрокам, уже имеющим опыт работы на платформе. Среди впечатляющего набора бонусной программы очень очень просто потеряться. Каждый промокод 1хбет гарантирует право на определенные преференции - промокод на 1 икс бет.

    ОтветитьУдалить
  8. БК MelBet пользуется большой популярностью сегодня на отечественном рынке: -Деятельность фирмы лицензирована; - Пользователям предоставлен впечатляющий список ставок - в формате live и предматчевых; - Тут нет задержек с выплатами. Линия ставок неописуемо привлекательна. Для того, чтобы получить выгодный бонус на совершение ставок, нужно всего только использовать промокод MelBet RS777. Получить промокод вы можете на ставку либо на депозит. Каждое предложение имеет свои особенности отыгрыша - промокод Мелбет.

    ОтветитьУдалить
  9. В 2023 году промокод 1хбет предоставляющий максимальный бонус - 1XFREE777. Бонусные денежные средства начисляются автоматически на отдельный счет и их сразу же вы можете использовать для игры - промокод 1хбет.

    ОтветитьУдалить