DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Работа с записями

Вне зависимости от того, каким способом была определена запись (на основе таблицы, курсора или явного использования оператора TYPE для записи), работа со всеми записями ведется одинаково. Вы можете работать с данными, хранящимися в записи, на уровне записи (запись воспринимается как единое целое), а также обращаться напрямую к ее отдельным полям.
Операции на уровне записи
Когда вы работаете на уровне записи, то какие бы то ни было ссылки на отдельные поля отсутствуют. На текущий момент PL/SQL поддерживает следующие операции над записями:
Вы можете копировать содержимое одной записи в другую (в случае совместимости их структур, то есть у них должно быть одинаковое количество полей и одинаковые или взаимно преобразуемые типы данных).
Вы можете присваивать записи значение NULL простым присваиванием.
Вы можете определять и передавать запись как аргумент в списке параметров.
Вы можете возвращать (оператором RETURN) запись из функции.
Операции на уровне записей можно применять к любым записям с совместимыми структурами. Другими словами, записи должны иметь одинаковое количество полей и одинаковые или взаимно преобразуемые типы данных, но они не обязаны быть одного типа. Предположим, что мы создали такую таблицу:

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

Операции на уровне поля
Если вам необходимо получить доступ к полю записи (чтобы прочитать или изменить значение), необходимо использовать точечную нотацию, в точности как при ссылке на столбец определенной таблицы базы данных. Синтаксис ссылки на поле будет таким:

Имя пакета должно быть указано только в том случае, если запись определяется в спецификации пакета, отличного от того, в котором вы работаете в настоящий момент. Имя схемы следует указывать лишь в том случае, если пакет принадлежит не той схеме, в которой вы компилируете свой код.
После того как вы определили поле с помощью точечной нотации, вы можете ссылаться на значение этого поля и изменять его в соответствии с обычными правилами, принятыми в PL/SQL.
Коллекции
Коллекция - это структура данных, которая похожа на список или одномерный массив. Коллекция - ближайший родственник традиционного массива в PL/SQL. Коллекции можно использовать для управления массивами данных.
Типы коллекций
Oracle поддерживает коллекции трех видов. Они имеют много общего, но обладают и специфическими характеристиками.
Ассоциативные массивы
Это одномерные неограниченные разреженные коллекции однородных элементов, которые доступны только в PL/SQL. Они назывались PL/SQL-таблицами в версии PL/SQL 2 и индекс-таблицами в версиях Oracle8 Database и Oracle8i Database (название объясняется тем, что при объявлении такой коллекции необходимо явно указать, что она индексируется номером строки). В версии Oracle9i Database появилось название ассоциативные массивы. Изменение названия было вызвано тем, что начиная с этой версии конструкция INDEX BY может использоваться для «ассоциирования» (индексирования) содержимого значениями VARCHAR2 или PLS_INTEGER.
Вложенные таблицы
Это также одномерные неограниченные коллекции однородных элементов. Изначально они являются плотными (dense), но в результате удалений могут стать разреженными. Вложенные таблицы могут быть определены как в PL/SQL, так и в базе данных (например, в качестве столбца таблицы). Вложенные таблицы являются мультимножествами, что означает, что не определен никакой внутренний порядок для элементов вложенных таблиц.
Массивы VARRAY
Как и другие типы коллекций, массивы переменной длины (тип VARRAY, variable-sized arrays) также являются одномерными коллекциями однородных элементов. Отличие в том, что они всегда ограничены и никогда не бывают разреженными. Определяя тип VARRAY, вы обязаны указать максимальное количество элементов, которое он может содержать. Как и вложенные таблицы, массивы типа VARRAY могут использоваться как в PL/SQL, так и в базе данных. Но в отличие от вложенных таблиц, порядок элементов в массиве VARRAY сохраняется при сохранении и извлечении такого массива.
Работа с коллекциями
В разделе рассматриваются достаточно простые примеры для каждого из типов коллекций с разъяснением их основных характеристик.
Использование ассоциативного массива
В следующем примере объявлен тип - ассоциативный массив, затем объявлена коллекция этого типа. Заполняем коллекцию четырьмя строками данных, затем в цикле проходим по ней, выводя содержащиеся в ней строковые значения. Более подробное описание будет приведено следом за фрагментом кода.


Строки
Описание
2-3
Объявляем тип - ассоциативный массив, используя специальное предложение INDEX BY. Коллекция, объявляемая на основе этого типа, содержит список строковых значений, длина каждого из которых оп­ределяется размерностью столбца first_name таблицы person.
4
Объявляем коллекцию happyfamily на основе типа list_of_names_t.
9-10
Заполняем коллекцию четырьмя именами. Имейте в виду, что мож­но было бы использовать практически любое целое значение. Номера строк ассоциативного массива не обязаны быть последовательными и могут быть даже отрицательными!
12
Вызываем метод (функцию, которая «привязана» к коллекции) FIRST для получения первого или наименьшего номера строки в коллек­ции.
14-18
Используем цикл WHILE для просмотра содержимого коллекции с вы­водом каждой строки. В строке 17 использован метод NEXT для перехо­да от текущей строки к следующей с пропуском возможных пустот.

Использование вложенной таблицы
В следующем примере сначала объявим тип - вложенную таблицу на уровне схемы данных. В PL/SQL-блоке объявим на основе этого типа три вложенных таблицы. Поместим во вложенную таблицу happyfamily имена всех членов семьи. Имена детей поместим во вложенную таблицу children. Затем используем появившийся в версии Oracle Database 10^ оператор над множествами MULTISET EXCEPT для извлечения из вложенной таблицы happyfamily родителей и поместим их имена во вложенную таблицу parents. Выведем содержимое таблицы parents. Более подробное описание будет приведено следом за фрагментом кода.


Строки
Описание
Раздел A
Оператор CREATE TYPE создает тип - вложенную таблицу непосредствен­но в базе данных. Благодаря созданию типа в базе данных мы теперь имеем возможность объявлять вложенные таблицы в любом PL/SQL-

Строки
Описание

блоке, который обладает полномочиями на SELECT для этого типа. Также можно объявлять на основе этого типа столбцы реляционных таблиц.
2-4
Объявляем три разных вложенных таблицы на основе определенного для схемы типа. Обратите внимание, что каждый раз для инициали­зации вложенной таблицы используется функция-конструктор. Эта функция всегда имеет такое же имя, что и тип, ее создает для нас Oracle. Для того чтобы можно было использовать вложенную табли­цу, ее необходимо инициализировать.
6
Вызываем метод EXTEND для того, чтобы расширить коллекцию и вме­стить во вложенную таблицу членов моей семьи. Здесь, в отличие от ассоциативных массивов, необходимо явно запрашивать строку вло­женной таблицы, прежде чем поместить в нее элемент.
7-10
Заполняем коллекцию happyfamily нашими именами.
12-15
Заполняем коллекцию children. В данном случае расширяем коллек­цию построчно.
17
Для того чтобы определить, кто в этой семье является родителем, просто вычитаем children из happyfamily. В версиях, начиная с Oracle Database 10g, это очень легко сделать при помощи оператора над множествами MULTISET EXCEPT (он очень похож на SQL-команду MINUS).
19-22
Нам точно известно, что коллекция parents плотно заполнена в ре­зультате выполнения операции MULTISET EXCEPT, поэтому можно ис­пользовать цикл FOR со счетчиком для просмотра содержимого кол­лекции. Если попытаться использовать такую конструкцию для раз­реженной коллекции, то будет вызвано исключение NO_DATA_FOUND.
 









jAntivirus