DeepEdit!

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

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

Записи PL/SQL

Скалярные типы (NUMBER, VARCHAR2, DATE и т.д.) предопределены в модуле STANDARD. Поэтому для использования скалярного типа в программе нужно лишь объявить переменную этого типа. С другой стороны, состав­ные типы определяются пользователем. Для применения составного типа необходимо сначала определить тип, а затем объявить переменные этого типа — аналогично синтаксису объявления подтипа (см. выше).
Записи PL/SQL аналогичны структурам С. Запись предоставляет спо­соб работы с отдельными, но связанными между собой переменными как с целым. Рассмотрим следующий раздел объявлений:
Эти три переменные являются логически связанными, так как ссыла­ются на общие поля таблицы students. При объявлении типа записи для этих переменных между ними создается отношение, и ими можно мани­пулировать как целым. Рассмотрим пример:
Общий синтаксис определения типа записи:
TYPE record_type ISRECORD ( fieldl typel [NOT NULL]  [:= exprl], field! type2 [NOT NULL]   [:= expr2],
fieldn typen [NOT NULL] [:= exprn],
где record^typ, — имя нового типа, поля fieldl fieldn — имена полей записи, а типы typel... typen — типы соответствующих полей. Запись может иметь сколько угодно полей. Объявление каждого поля выглядит по сути так же, как объявление переменной вне записи, включая ограничения NOT NULL и начальные значения. Выражения exprl... exprn задают начальное значение каждого поля. Как и для объявлений переменных вне записи, начальное значение и ограничение NOT NULL являются необязательны­ми. В следующем разделе объявлений определяется тип записи t_Sample-Record и объявляются две записи этого типа:
Аналогично объявлениям, находящимся вне определения записи, если поле ограничено с помощью NOT NULL, оно должно иметь начальное значение. Любое поле без начального значения инициализируется как NULL. Можно использовать либо ключевое слово DEFAULT, либо := для определения значения по умолчанию.
Обратиться к полю внутри записи можно следующим образом:
имя_записи.имя_поля
В следующем примере показано, как можно обратиться к полям в запи­сях v_Sample1 и v_Sample2:
BEGIN
/* SYS DATE является встроенной функцией, которая возвращает текущие
дату и время */ v_Sample1. Ef f ectiveDate := SYSDATE; v_Sample2.Description := 'Pesto Pizza';
END;
Подобная ссылка является значением выражения (rvalue) и поэтому может использоваться с любой стороны оператора присваивания.

Присваивание записей
Чтобы присвоить одну запись другой, обе записи должны быть одного типа. Например, для предыдущих объявлений v_Sample1 и v_Sample2 следую­щее присваивание законно:
Такое присваивание записей использует семантику копирования — зна­чениям полей в v_Samplel будут присваиваться значения соответствую­щих полей в v_Sample2. В случае же двух различных типов, имеющих одинаковые определения полей, записи нельзя присвоить друг другу. В следующем примере возникает ошибка "PLS-382: expression is of wrong type" (выражение неверного типа):
Запись можно указывать в операторе SELECT. При этом данные из базы данных будут извлекаться и помещаться в запись. Поля записи дол­жны соответствовать полям, выбираемым в запросе. Следующий пример иллюстрирует такое использование записей:
1 Oracle!) г позволяет также использовать записи в операторах INSERT и J UPDATE для изменения данных в базе данных (см. главу 4).

Использование %ROWTYPE
Довольно часто в PL/SQL для объявления записи применяются типы
данных, соответствующие строке базы данных. Для этих целей PL/SQL предоставляет оператор %ROWTYPE. Аналогично %TYPE, %ROWTYPE возвращает тип данных на основе определения таблицы. Например, та­кое объявление, как
DECLARE
v_RoomRecord rooms%ROWTYPE;
определяет запись, поля которой соответствуют столбцам таблицы rooms. В частности, v_RoomRecord будет выглядеть следующим образом:
Как и в случае        сюда не включается ограничение NOT NULL,
определенное для столбца. Однако длина столбцов VARCHAR2 и CHAR, а также точность и масштаб для столбцов NUMBER учитываются.
Если определение таблицы изменяется, то %ROWTYPE изменяется вместе с ним. Подобно %TYPE, %ROWTYPE определяется всякий раз, когда анонимный блок передается среде выполнения PL/SQL, и всякий раз, когда компилируется хранимый объект.
 









jAntivirus