Oracle составной тип данных

Обновлено: 05.07.2024

Составные типы данных
В PL/SQL существует 2 составных типа данных:
•Record (запись) - Запись как целое не имеет собственного
значения; однако значение имеет каждый ее компонент или
поле, а объединение их в единую запись позволяет хранить и
обрабатывать все значения как одно целое. Записи сильно
упрощают работу программиста, а переход от объявлений
уровня полей к уровню записей повышает эффективность
написания кода.
•Collection (коллекция) 3 типа
• Ассоциативный массив
• Вложенная таблица
• VARRAY

Создание PL/SQL Record
TYPE type_name IS RECORD
(field_declaration[, field_declaration]…);
identifier type_name;
где field_declaration описывается как:
field_name variable%TYPE |
table.column%TYPE |
table%ROWTYPE>
[[NOT NULL] expr]
TYPE имя_типа
(имя_поля1
имя_поля2
.
имя_поляN
);
IS RECORD
тип_данных1 [[NOT NULL]:=|DEFAULTзначение_по_умолчанию],
тип_данных2 [[NOT NULL]:=|DEFAULT значение_по_умолчанию],
тип_данныхN [[NOT NULL]:=|DEFAULT значение_по_умолчанию]

RECORD
Объявление записей:

Запись, определяемая программистом
DECLARE
TYPE book_info IS RECORD (
author books.author%TYPE,
category VARCHAR2(100),
total_page_count POSITIVE);
v_book book_info;

Запись на основе таблицы
DECLARE
V_CNTY COUNTRIES%ROWTYPE;
Record это НЕ запись таблицы БД

Пример
.
TYPE emp_record_type IS RECORD
(ename VARCHAR2(25),
job
VARCHAR2(10),
sal
NUMBER(8,2));
emp_record emp_record_type;
.

Создание PL/SQL Record
.
TYPE emp_record_type IS RECORD
(empno NUMBER(4) NOT NULL:=100,
ename emp.ename%TYPE,
job
emp.job%TYPE );
emp_record emp_record_type;
.

Атрибут %ROWTYPE
• Переменная составного типа коллекции столбцов в
таблице или представлении.
• Префикс %ROWTYPE используется для
обращения к коллекции базирующейся на
столбцах таблицы
• Поля в Record будут именованы также и того же
типа что и поля таблицы БД

Преимущества использования %ROWTYPE
• Тип данных и количество полей таблицы
базы данных может быть неизвестно.
• Тип данных и количество полей таблицы
базы данных может быть в любое время
изменено.
• Атрибут может быть использован после того
как данные выбраны Select *

%ROWTYPE (пример)
Пример объявления переменной, департамент:
dept_record departments%ROWTYPE;
Пример объявления переменной, сотрудники:
emp_record employee%ROWTYPE;

Пример
DECLARE
my_book books%ROWTYPE;
BEGIN
SELECT *
INTO my_book
FROM books
WHERE title = 'Oracle PL/SQL';
DBMS_OUTPUT.put_line ('Код ISBN: ' || my_book.isbn);
END;

Операции над RECORD (записями)
PL/SQL поддерживает следующие операции над записями:
копирование содержимого одной записи в другую (если они имеют совместимую
структуру, то есть одинаковое количество полей одного или взаимопреобразуемых
типов);
присваивание записи значения NULL (простым оператором присваивания);
передача записи в качестве аргумента и возврат записи функцией (RETURN)
Операции на уровне записей не поддерживаются:
проверить, содержат ли все поля записи значение NULL, использовать синтаксис IS
NULL нельзя. Осуществить такую проверку можно лишь путем приме нения
оператора IS NULL по отношению к каждому полю
Невозможно сравнить две записи в одной операции. Нельзя узнать, равны или нет
две записи (то есть значения всех их полей), или же узнать, какая из записей больше.
чтобы ответить на эти вопросы, нужно сравнить каждую пару полей.
* Записи в PL/SQL. Глава 11. Oracle_PL-SQL_dlya_professionalov_6-e_izdanie.pdf

Составные типы данных: Collection
В PL/SQL существует 2 составных типа данных:
•Record (запись)
•Collection (коллекция) – аналог традиционных массивов. 3
типа коллекций : Ассоциативный массив, Вложенная таблица,
VARRAY.
Ситуации для применения :
– Ведение списков данных.
– Ускорение многострочных операций SQL. Использование коллекций в
сочетании с конструкциями FORALL и BULK COLLECT повышает
производительность многострочных операций SQL.
– Кэширование информации базы данных. Коллекции хорошо подходят
для кэширования статической информации, которая часто
запрашивается в ходе одного сеанса.

Составные типы данных: Collection
Концепции и терминология
•Элементы и индексы. Коллекция состоит из множества элементов, каждый элемент
обладает своим индексом. Иногда элементы называются «строками», а индексы —
«номерами строк».
•Целочисленное / строковое индексирование. Индекс представляет собой
целочисленное значение. С Oracle9, в качестве индекса ассоциативных массивов можно
использовать строки (до 32 Кбайт длиной) – эта возможность не поддерживается для
вложенных таблиц, и VARRAY.
•Тип коллекции. Каждая переменная, представляющая коллекцию, должна быть
объявлена на основании заранее определенного типа.
•Разреженные и плотные коллекции. Коллекция (или массив, или список) называется
плотной, если все ее элементы, от первого до последнего, определены и каждому из них
присвоено некоторое значение (таковым может быть и NULL). Коллекция считается
разреженной, если отдельные ее элементы отсутствуют.
•Ограниченная и неограниченная коллекция. Коллекция называется ограниченной,
если заранее определены границы возможных значений индексов.
•Двумерные структуры в настоящее время напрямую не поддерживаются, можно
создать многомерный массив, объявляя коллекцию коллекцией

Составные типы данных: Collection
Ассоциативные массивы
•Это одномерные неограниченные разреженные коллекции, состоящие из однородных
элементов, доступные только в PL/SQL. Ранее в Oracle7) они назывались таблицами
PL/SQL, а в Oracle8 индексируемыми таблицами. С Oracle9 назваются ассоциативными
массивами. INDEX BY используется для индексирования посредством значений типа
VARCHAR2 или PLS_INTEGER.
Вложенные таблицы
•одномерные коллекции, состоящие из однородных элементов. Первоначально
заполняются полностью, позднее из-за удаления элементов могут стать разреженными.
Вложенные таблицы могут определяться и в PL/SQL, и в базах данных (например, в
качестве столбцов таблиц). Вложенные таблицы представляют собой
мультимножества, то есть элементы вложенной таблицы не упорядочены.
Массив типа VARRAY
•Размер всегда ограничен, не бывают разреженными. Как и вложенные таблицы,
массивы VARRAY используются и в PL/SQL, и в базах данных. Однако порядок их
элементов при сохранении и выборке, в отличие от вложенных таблиц, сохраняется.

Методы коллекций
Метод – встроенная функция, оперирующая с
коллекциями.

Collection Ассоциативные массивы
DECLARE
TYPE list_of_names_t IS TABLE OF
EMPLOYEES.first_name%TYPE
INDEX BY PLS_INTEGER;
l_row PLS_INTEGER;
happyfamily list_of_names_t;
BEGIN
happyfamily (2020202020) := 'Eli';
happyfamily (-15070) := 'Steven';
happyfamily (-90900) := 'Chris';
happyfamily (88) := 'Veva';
l_row := happyfamily.FIRST;
WHILE (l_row IS NOT NULL)
LOOP
DBMS_OUTPUT.put_line(happyfamily(l_row));
l_row := happyfamily.NEXT (l_row);
END LOOP;
END;
Объявление ассоциативного массива TYPE с
характерной секцией INDEX BY. Коллекция,
содержит список строк, тип - столбца first_name
таблицы EMPLOYEES.
Объявление коллекции happyfamily на базе типа
list_of_names_t.
Заполнение коллекции четырьмя именами. Можем
использовать любые целочисленные значения.
Номера строк в ассоциативном массиве не обязаны
быть последовательными, могут быть
отрицательными. Не пишите код с непонятными
значениями индексов. Это пример
всего лишь демонстрирует гибкость ассоциативных
массивов
Вызов метода FIRST (функция, «прикрепленная» к
коллекции) для получения первого
(минимального) номера строки в коллекции.
Перебор коллекции в цикле WHILE, с выводом
каждой строки. Вызывается метод NEXT, который
переходит от текущего элемента к следующему без
учета промежуточных пропусков

Создание Ассоциативных массивов
TYPE type_name IS TABLE OF
| table.column%TYPE> [NOT NULL]
| table.%ROWTYPE
[INDEX BY BINARY_INTEGER];
Identifier_name type_name;
Описание:
.
TYPE ename_table_type IS TABLE OF
emp.ename%TYPE
INDEX BY BINARY_INTEGER;
e_table ename_table_type;
.

Структура Ассоциативных массивов
PRIMARY_KEY
Column
.
.
1
Jones
2
Smith
3
Maduro
.
.
BINARY_INTEGER
Scalar

Пример
DECLARE
TYPE ename_t_type IS TABLE OF employees.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE hiredate_t_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
ename_table ename_t_type;
hiredate_table hiredate_t_type;
BEGIN
ename_table(1) := ’CAMERON’;
hiredate_table(8) := SYSDATE + 7;
IF ename_table.EXISTS(1) THEN
INSERT INTO .
.
END;

Пример 1
DECLARE
TYPE dept_table_type IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_table dept_table_type;
* dept%ROWTYPE – строка таблицы DEPT.

Пример 2
DECLARE
TYPE emp_table_type is table of emp.ename%TYPE
INDEX BY BINARY_INTEGER;
my_emp_table emp_table_type;
BEGIN
my_emp_table(1) : = ‘SMITH’;
UPDATE emp SET sal = 1.1 * sal
WHERE ename = my_emp_table(1);
COMMIT;
END;

Collection Вложенная таблица
Команда CREATE TYPE создает тип
вложенной таблицы в базе данных. Такое
--CREATE TYPE list_of_names_t IS TABLE OF VARCHAR2 (100); решение позволяет объявлять вложенные
таблицы в любой программе и объявлять
DECLARE
столбцы этого типа в таблицах.
TYPE list_of_names_t IS TABLE OF VARCHAR2 (100);
happyfamily list_of_names_t := list_of_names_t ();
Вызов метода EXTEND «выделяет место» во
children list_of_names_t := list_of_names_t ();
вложенной таблице для данных членов семьи.
В отличие от ассоциативных массивов, во
parents list_of_names_t := list_of_names_t ();
вложенных таблицах необходимо явно
BEGIN
выполнить операцию создания элемента,
happyfamily.EXTEND (4); happyfamily (1) := 'Eli';
прежде чем размещать в нем данные.
happyfamily (2) := 'Steven'; happyfamily (3) := 'Chris';
С версии Oracle10g, с появлением
happyfamily (4) := 'Veva';
высокоуровневых команд для работы с
children.EXTEND;
children (1) := 'Chris';
множествами вроде MULTISET EXCEPT
children.EXTEND;
children (2) := 'Eli';
(аналог SQL MINUS). Перед заполнением
parents := happyfamily MULTISET EXCEPT children;
parents вызывать метод EXTEND не нужно.
FOR I IN parents.FIRST .. parents.LAST
База данных делает это автоматически.
LOOP
Операция MULTISET EXCEPT плотно
DBMS_OUTPUT.put_line (parents (i));
заполняет коллекцию, для перебора
END LOOP;
можно пользоваться FOR со счетчиком. При
END;
использовании конструкции с разреженной
коллекцией произойдет исключение
NO_DATA_FOUND

Collection VARRAY
CREATE TYPE first_names_t IS VARRAY (2) OF VARCHAR2 (100);
CREATE TYPE child_names_t IS VARRAY (1) OF VARCHAR2 (100);
CREATE TABLE family ( surname VARCHAR2(1000),
parent_names first_names_t,
children_names child_names_t);
CREATE TYPE используется для
создания двух типов VARRAY.
VARRAY необходимо задать
максимальную длину коллекции.
Создание таблицы из трех столбцов:
VARCHAR2 для фамилии и двух
DECLARE
столбцов VARRAY (для родителей и
parents first_names_t := first_names_t ();
детей).
children child_names_t := child_names_t ();
Как и для вложенной таблицы (и в
BEGIN
отличие от ассоциативных
parents.EXTEND (2); parents (1) := 'Samuel'; parents (2) := 'Charina';
массивов), должны вызвать
children.EXTEND; children (1) := 'Feather';
функцию-конструктор, имя которой
совпадает с именем TYPE, для
INSERT INTO family
инициализации структур.
( surname, parent_names, children_names )
Расширение и заполнение
VALUES ( 'Assurty', parents, children );
коллекций; добавляются имена
END;
родителей и одного ребенка.
При попытке добавления второго
SELECT * FROM family
ребенка произойдет ошибка.
SURNAME PARENT_NAMES CHILDREN_NAMES
Простая вставка коллекций в
-------------------------------------------Assurty FIRST_NAMES_T('Samuel', 'Charina') CHILD_NAMES_T('Feather') таблицу.

26. Выбор типа коллекции

Как правило, разработчики
PL/SQL склонны к использованию
ассоциативных массивов. Потому
что ассоциативные массивы
требуют минимального
объема кода. Их не нужно
инициализировать или расширять.
Традиционно они считались самой
эффективной разновидностью
коллекций. Но если коллекция
должна храниться в таблице баз
данных, ассоциативный массив
отпадает. Остается вопрос:
вложенная таблица или VARRAY?

27. Массовая обработка

Массовая обработка - команда FORALL и секция BULK COLLECT конструкции массовой обработки (bulk processing).
PL/SQL выполняет процедурные команды самостоятельно, а команды SQL
передает ядру SQL. Каждое переключение контекста приводит к
дополнительным затратам ресурсов.

28. FORALL

FORALL говорит ядру PL/SQL выполнить массовую привязку всех элементов одной
или нескольких коллекций перед отправкой команд ядру SQL.
Тело FORALL должно представлять одну команду DML: INSERT, UPDATE, DELETE
или MERGE (c Oracle11).
Команда DML должна содержать ссылки на элементы коллекции, индексируемые в
команде FORALL. нижняя_граница и верхняя_граница не обязаны задавать все
множество элементов коллекции.
for cnt in 1..100000 loop
insert into temp_bulk values(numb(cnt),name(cnt));
end loop;
FORALL i in 1..100000
insert into temp_bulk values(numb(i),name(i));
* Демонстрация 3х примеров.
* Скорость и ошибки.
Execution Time (secs)
--------------------FOR loop: 4,9
FORALL: ,14

29. BULK COLLECT

BULK COLLECT позволяет за одно обращение к базе данных извлечь из явного
или неявного курсора несколько строк данных. Выборка данных с помощью запроса
с секцией BULK COLLECT сокращает количество переключений контекста между
PL/SQL и SQL, благодаря чему работа выполняется быстрее и с меньшими затратами.
DECLARE
TYPE first_name_t IS TABLE OF EMPLOYEES.first_name%TYPE;
TYPE salary_t IS TABLE OF EMPLOYEES.salary%TYPE;
v_first_name first_name_t;
v_salary salary_t;
BEGIN
SELECT first_name, salary BULK COLLECT INTO v_first_name, v_salary
FROM employees
WHERE job_id = 'IT_PROG' ;
FOR i IN 1 .. v_first_name.COUNT
LOOP
dbms_output.put_line(v_first_name(i)||' earns - ' ||v_salary(i) );
END LOOP;
END;

30. Итоги

• Изучены составные типы данных:
– Записи
– Коллекции 2 типа
– FORALL и BULK COLLECT

Запись - это логическая единица, состоящая из группы связанных элементов данных, и каждый элемент данных имеет собственное имя и тип данных.

Таблица - это набор данных, и на данные в таблице можно ссылаться и обрабатывать их как единое целое.

Таблица состоит из столбцов и ключевых слов, а доступ к строкам можно получить в группах по ключевым словам.

После определения можно повторно использовать как записи, так и таблицы.

PL/SQL запись

• Запись - это группа связанных элементов данных, хранящихся в нескольких полях, каждое поле имеет собственное имя и тип данных. К
• Рассматривайте коллекцию полей как единую логическую единицу.
• В основном используется для извлечения данных строки запроса из таблицы.

Особенности записи:

• В каждой записи может быть много полей. К
• Вы можете назначать начальные значения записям, и вы можете использовать NOT NULL для ограничения записей.
• Поле без начального значения определяется как NULL • Зарезервированное слово DEFAULT также может использоваться при определении поля.
• Вы можете определить тип RECORD и объявить определяемые пользователем записи в части объявления любого блока, подпрограммы или пакета.
• Вы можете объявлять вложенные записи и ссылаться на них, одна запись может быть компонентом других записей.

грамматика:

TYPE type_name IS RECORD (field_declaration[, field_declaration]…);

field_name [[NOT NULL] expr]
TYPE emp_record_type IS RECORD (empno emp.empno%type, ename emp.ename%type, job varchar2(9)); emp_record emp_record_type ;
В присвоении можно использовать точечную нотацию для ссылки на поле в записи.

record_name.field_name

%ROWTYPE Атрибуты

• Объявленная переменная соответствует набору столбцов в таблице или представлении базы данных.
• Добавьте имя таблицы базы данных перед% ROWTYPE
• Имя и тип данных поля в записи относятся к столбцу в таблице или представлении.

DECLARE emp_record emp%rowtype; …. emp_record.ename=‘ljs’; emp_record.sal=3000; SELECT * INTO emp_record FROM emp WHERE ……;
Преимущества% ROWTYPE:

• Вам не нужно знать количество и типы столбцов в базе данных.
• Во время работы количество и типы столбцов в базе данных могут изменяться. К
• Используйте этот атрибут в инструкции SELECT для эффективного извлечения строк в таблице.

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

Записи

Коллекции

Методы коллекций

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

С нулевой коллекцией EXISTS является единственным методом сбора, который не вызывает предопределенное исключение COLLECTION_IS_NULL.

Метод коллекции Тип Описание
DELETE Процедура Удаляет элементы из коллекции.
TRIM Процедура Удаляет элементы из конца varray или Nested Tables.
EXTEND Процедура Добавляет элементы в конец varray или Nested Tables.
EXISTS Функция Возвращает TRUE тогда и только тогда, когда существует определенный элемент varray или Nested Tables.
FIRST и LAST Функции FIRST возвращает первый, LAST последний индекс в коллекции.
COUNT Функция Возвращает количество элементов в коллекции.
LIMIT Функция Возвращает максимальное количество элементов, которые может иметь коллекция.
PRIOR и NEXT Функции PRIOR возвращает индекс, который предшествует указанному индексу, NEXT возвращает индекс, который следует за указанным индексом.

Операции над коллекциями

MULTISET UNION Возвращает объединение двух коллекций
MULTISET UNION DISTINCT Возвращает объединение двух коллекций с дистинктом (убирает дубли)
MULTISET INTERSECT Возвращает пересечение двух коллекций
MULTISET INTERSECT DISTINCT Возвращает пересечение двух коллекций с дистинктом (убирает дубли)
SET Возвращает коллекцию с дистинктом (т.е. коллекцию без дублей)
MULTISET EXCEPT Возвращает разницу (усечение) двух коллекций
MULTISET EXCEPT DISTINCT Возвращает разницу (усечение) двух коллекций с дистинктом (убирает дубли)

Исключительные ситуации коллекции.

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

/*Предположим, что выполнение продолжается, несмотря на возникшие исключения.*/
  • В первом случае вложенная таблица атомарно равна NULL.
  • Во втором случае индекс равен NULL.
  • В третьем случае индекс находится за пределами допустимого диапазона.
  • В четвертом случае индекс превышает количество элементов в таблице.
  • В пятом случае индекс обозначает удаленный элемент.

Следующий список показывает, когда возникает данное исключение:

Исключение коллекции Когда возникает
COLLECTION_IS_NULL вы пытаетесь оперировать с атомарно нулевой коллекцией.
NO_DATA_FOUND обозначает элемент, который был удален, или несуществующий элемент ассоциативного массива.
SUBSCRIPT_BEYOND_COUNT индекс превышает количество элементов в коллекции.
SUBSCRIPT_OUTSIDE_LIMIT индекс находится за пределами допустимого диапазона.
VALUE_ERROR индекс не имеет значения или не может быть преобразован в тип ключа. Это исключение может возникнуть, если ключ определен как диапазон PLS_INTEGER, а индекс находится за пределами этого диапазона.

В некоторых случаях вы можете передавать недопустимые индексы в метод, не вызывая исключения. Например, когда вы передаете нулевой индекс процедуре DELETE, она ничего не делает. Кроме того, вы можете заменить удаленные элементы, без возникновения NO_DATA_FOUND, как показано в следующем примере:

Традиционно в программировании принято считать, что переменная - это именованная ячейка памяти, имя которой используется для доступа к данным. Можно сказать просто, что переменная - это обозначение, заменяющее какое-либо значение, будь то число, массив, строка или еще какой-нибудь тип. Переменные используются для следующих целей:

  • Временное хранение данных.
  • Манипуляция хранимыми значениями.
  • Возможность многократного использования.
  • Простота обслуживания.
  • Повышение читаемости программы.

С понятием переменная чаще всего связываются такие понятия, как область видимости переменной, идентификаторы, ее тип и имя.

Типы переменных PL/SQL

PL/SQL, как и любой другой язык программирования, оперирует различными типами данных (табл. 15.1). Переменные PL/SQL:

  • Скалярные ( Scalar ) - скалярные типы данных содержат одно значение. К скалярным типам данных относятся все основные типы данных сервера Oracle, за исключением Boolean , которые не могут быть назначены для столбцов.
  • CLOB (character large object) - позволяет хранить большие блоки символьных данных;
  • BLOB ( binary large objects) - служит для хранения больших бинарных объектов;
  • BFILE ( binary file ) - служит для хранения больших бинарных объектов за пределами Базы Данных;
  • NCLOB (national-language character large objects) - служит для хранения больших single-byte или fixed-width NCHAR Unicode данных;
  • EXPR - любое значение, которое подходит по смыслу и типу данных.
Примечание: в PL/SQL также используются связываемые переменные (bind variable) и переменные операционной системы, но они не относятся к PL/SQL.
Объявление переменных

Все переменные PL/SQL необходимо объявлять в декларативном разделе - DECLARE . Рассмотрим синтаксис объявления переменной:

Identifier - имя переменной. После объявления имени переменой на нее можно ссылаться по имени из любой части программы.

CONSTANT - это переменная, значение которой нельзя изменить. Эта переменная должна быть инициализирована. Инициализация в данном контексте означает, что значение переменной при создании должно быть определенно, то есть значение этой переменной необходимо присвоить в разделе DECLARE . Инициализация переменной производится с помощью оператора присвоения (:=) или ключевого слова DEFAULT .

Datatype - определяет тип данных: скалярный, составной, ссылочный и LOB.

NOT NULL - ограничение, которое говорит о том, что значение переменой не может быть пустым. Эта переменная должна быть инициализирована.

Рассмотрим пример объявления некоторых типов переменных.

  1. Создайте новую форму и сохраните под именем Var.fmb.
  2. Перейдите в узел "Блоки Данных". Правым щелчком мыши вызовите всплывающее меню и выберите пункт "Редактор Разметки".
  3. Разместите новую кнопку на канве. После того как вы разместите кнопку на канве, Oracle Forms автоматически создаст блок.
  4. Выделите кнопку и вызовите всплывающее меню. Во всплывающем меню выберите пункт Универсальные триггеры | WHEN-BUTTON-PRESSED . В появившемся PL/SQL-редакторе наберите и скомпилируйте нижеприведенный код:
  • Height - переменная численного типа с пятью знаками до запятой и двумя после, хранит значение высоты;
  • Age - переменная численного типа без определения разряда, хранит значение возраста;
  • Weight - константа численного типа. Значение инициализации 74.5;
  • Name - переменная символьного типа , хранит значение имени. Максимальный размер - десять символов;
  • S_name CHAR (20) - переменная символьного типа , хранит значение фамилии. Максимальный размер - двадцать символов;
  • F_name - значение символьного типа . Не может быть пустым, инициализировано значением "Васильевич";
  • Man - переменная логического типа , инициализирована в TRUE ; значение TRUE или FALSE указывать без кавычек. Переменная типа Boolean может принимать только три типа значений:
    • TRUE ;
    • FALSE ;
    • NULL .

    В PL/SQL существует множество зарезервированных слов (табл. 2), которые не могут быть использованы для объявления переменных. Также не следует называть переменные именами столбцов. Ниже приведен пример неправильного объявления переменных:

    Объявление переменных с атрибутом %TYPE

    Префикс %TYPE используется для объявления переменных, ассоциированных с ранее объявленными переменными или столбцами Базы Данных. Основное преимущество префикса в том, что при объявлении переменная, которая впоследствии будет ассоциирована со столбцом Базы Данных, должна быть точно объявлена (имя, разряд) во избежание ошибок. Вы не можете помнить все значения типов данных столбцов таблицы, разрядность численных типов и размерность символьных полей, поэтому понимание использования этого префикса очень важно. Ниже приведен синтаксис и пример объявления префикса:

    t_city - переменная типа city . Переменная символьного типа , хранит значение - "Мариуполь";

    pr_key - хранит значение столбца таблицы about.pr_key .

    Примечание: NOT NULL столбцы не могут быть объявлены с префиксом %TYPE .
    Область видимости переменной

    Область видимости переменной - это область, в которой она определена. В большинстве случаев все переменные имеют единую область видимости. Переменная может быть локальной, глобальной или одновременно и той и другой. Локальная переменная - это переменная, локальная для блока, в котором она объявлена. Глобальная переменная - это переменная, действующая для всех вложенных блоков , которые находятся внутри блока, где она объявлена. Если на одном из уровней вложенности эту переменную переопределить, то она станет глобальной для всех нижестоящих уровней. Блоку, стоящему на одном уровне вложенности с другим, нельзя ссылаться на переменную, объявленную в этом блоке.

    В этом разделе мы рассмотрели основные типы данных, применяемых в PL/SQL, а также правила и способы их объявления.

    Обращение к элементам Oracle Forms в операторах PL/SQL

    Для того чтобы обращаться к элементам, блокам, окнам и параметрам, нужно перед названием объекта поставить двоеточие. Ниже приведены основные примеры обращения к объектам Oracle Forms :

    • :parameter.param_name - обращение к параметру. Слово parameter обязательно.
    • :block_name.item_name - обращение к элементу блока. Block_name - это идентификатор блока данных, которому принадлежит элемент, к коему мы обращаемся. Если в форме элемент один, то название блока можно будет опустить, в противном случае вы получите ошибку - "Неверная переменная привязки".
    • :block - обращение к блоку. В этом случае никаких вспомогательных префиксов не требуется.
    • :column_name - обращение к элементу. Если элемент в форме один, к нему можно обращаться без указания имени блока.
    • :system.variable_name - обращение к системной переменной . Слово SYSTEM является обязательным.
    • :global.global_name - обращение к глобальной переменной. Слово global является обязательным.
    Косвенное обращение к элементам

    В Oracle Forms существует два вида непрямого обращения к элементам:

    Процедура COPY

    COPY - копирует указанное значение в указанный элемент. Ниже рассмотрено два вида обращения к элементу.

    : about.age:=20 - это прямое обращение, элементу age присваивается значение 20.

    COPY(20, 'about.age') - непрямое обращение, в элемент age помещается значение 20.

    Функция NAME_IN

    NAME_IN - возвращает содержимое элемента или переменной. Эта функция может быть вложена в другие функции. Ниже приведены примеры обращения к элементам с помощью функции NAME_IN :

    Функция NAME_IN может использоваться совместно с процедурой COPY , например, копирование в элемент REF указанного значения:

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

    Комментарии

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

    Однострочные комментарии

    Однострочный комментарий удобен для комментирования небольших фрагментов кода, одиночных строк или коротких фраз. Однострочные комментарии начинаются двумя дефисами (--), текст после которых до конца строки считается закомментированным. Ниже приведен пример

    однострочного комментария, который объясняет назначение процедуры sum_price :

    Многострочные комментарии

    В случае когда необходимо закомментировать большой фрагмент программы, расстановка однострочных комментариев займет приличное время, так как они удобны скорее для небольших фрагментов кода. Многострочный комментарий полезен для написания больших пояснений к тексту программы. В многострочном комментарии текст размещается между парой символов (/*) и (*/) - весь текст, размещенный между этой парой символов считается закомментированным. Ниже приведен пример многострочного комментария:

    Используйте комментарии, это поможет не только вам ориентироваться в вашем же коде, но и тем разработчикам, которым, возможно, придется дорабатывать или изучать вашу программу.

    Читайте также: