Объявление переменных осуществляется в разделе объявлений, при этом помимо идентификатора переменной должен быть указан и ее тип. К основным типам данных языка PL/SQL относятся скалярные и составные типы. Среди составных типов наибольший интерес представляет тип RECORD (запись).
Объявление скалярных типов данных.Среди скалярных типов наиболее распространены числовые, символьные, тип DATE и логический (BOOLEAN) типы данных.
Числовыетипы данных представлены в основном двумя типами: BINARY_INTEGER и NUMBER. Все другие числовые типы являются подмножествами двух этих типов.
Тип переменных BINARY_INTEGER используется для хранения целых знаковых чисел в двоичном виде. Диапазон этого типа от
– 2147483647 до 2147483647.
Тип переменных NUMBER используется для хранения чисел с фиксированной и плавающей точкой в диапазоне от 1Е–130 до 10Е125. Для объявления чисел с плавающей точкой можно просто указать NUMBER. Для объявления целого числа указывается NUMBER(точность), а для объявления числа с фиксированной точкой дополнительно указывается еще и масштаб, т. е. NUMBER(точность, масштаб). Точность представляет собой общее число знаков и не превосходит 38 десятичных знаков, масштаб указывает порядок округления и задается числом от –84 до 127. При положительном значении масштаба число округляется до указанного количества цифр, стоящих справа от запятой; при отрицательном значении число округляется до указанного количества цифр, стоящих слева от запятой. Например: число 123.456 при значении масштаба, равном 2, округляется до 123.46, а при значении, равном – 2, округляется до 100.
Ксимвольнымтипам данных в основном относятся типы CHAR и VARCHAR2.
Тип CHAR(длина) используется для хранения последовательности символов фиксированной длины не более 32767 байт. Следует иметь в виду, что в языке SQL максимальное значение аналогичного типа равно 2000 байт, поэтому не все данные этого типа можно вставлять в столбцы таблицы с типом CHAR.
Тип VARCHAR2(длина) используется для хранения символьной последовательности переменной длины. Ограничение на длину составляет 32767 байт.
Тип DATE используется для хранения значений даты и времени. Значение даты и времени хранится во внутреннем двоичном формате и при помещении его в переменную символьного типа автоматически преобразуется в строку, используя формат даты, установленный по умолчанию. Функция SYSDATE возвращает текущее значение даты и времени.
Тип BOOLEAN используется для хранения логических значений TRUE, FALSE, NULL. Над такими переменными можно выполнять только логические операции, причем в трехзначной логике.
Скалярные переменные объявляются явным и неявным образом.
Явное объявление переменной любого из скалярных типов осуществляется по следующему правилу:
имя_переменной [CONSTANT] тип [NOT NULL]
[{:= ïDEFAULT} значение];
При использовании ключевого слова CONSTANT переменной должно быть присвоено значение, которое впоследствии не может быть изменено. Если указано ключевое слово NOT NULL, то переменную необходимо проинициализировать и впоследствии она не может принимать значение NULL. Переменная инициализируется значением своего типа либо с помощью оператора присваивания, либо с помощью ключевого слова DEFAULT. Каждая переменная объявляется отдельно.
Неявное объявление переменной скалярного типа осуществляется с помощью специального атрибута %TYPE, который позволяет объявить переменную, тип которой соответствует либо типу другой переменной, либо типу столбца таблицы базы данных.
Пример.
A1 NUMBER;
A11 NUMBER:=15;
A12 NUMBER NOT NULL DEFAULT 15;
A2 A1%TYPE;
A3 KNIGA.ЦЕНА%TYPE;
Объявляя переменные, следует иметь в виду, что:
1) имена локальных переменных и формальных параметров имеют приоритет перед именами таблиц базы данных;
2) имена столбцов таблицы базы данных имеют приоритет перед именами локальных переменных и формальных параметров.
Объявление переменных типа RECORD (запись).Составной тип запись определяет структуру, содержащую любое число переменных – элементов любого типа, включая ранее определенные записи. Ссылка на отдельные элементы этой структуры осуществляется с помощью точечной нотации.
Тип записи должен быть определен до того, как будут объявлены переменные этого типа. Для явного определения нового составного типа данных используется следующий общий синтаксис:
Для явного объявления переменной-записи этого типа необходимо указать имя переменной и имя типа. Допускается неявное определение переменных типа запись, выполняемое с помощью атрибута %ROWTYPE, что позволяет определять переменные-записи, структура которых идентична структуре записи указанной таблицы или структуре ранее определенной переменной-записи.
Рассмотрим переменную-запись, объявляемую явно:
DECLARE
TYPE BOOK IS RECORD --вводится тип записи – BOOK
(
AUTHOR VARCHAR2(15), --фамилия автора
NAME VARCHAR2(25), --название книги
PRICE NUMBER(6) --цена
);
BOOK_FAN BOOK; --явное объявление
BOOK_ROM BOOK; --явное объявление
BOOK_POEM BOOK_FAN%ROWTYPE; --неявное объявление
Присваивание значений элементам, входящим в запись, необходимо выполнять поэлементно, используя точечную нотацию:
BOOK_FAN.PRICE := 16000;
Для присвоения значений сразу всем полям записи или нескольким из них можно воспользоваться однострочным оператором SELECT либо оператором выборки очередной строки из открытого курсора FETCH:
Возможно присвоение значения одной переменной-записи другой при условии, что они одного типа:
BOOK_FAN := BOOK_ROM;
Однако следует иметь в виду, что переменная-запись, тип которой определен явно, и переменная-запись, тип которой определяется с помощью атрибута %ROWTYPE, всегда несовместимы.
Не допускается сравнение переменных-записей.
Ошибочной будет попытка передать в качестве значений в команде INSERT запись целиком. Значения записи должны передаваться поэлементно: