русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Лекция №12: Коллекции и записи


Дата добавления: 2015-07-09; просмотров: 556; Нарушение авторских прав


Коллекции Коллекцией называется упорядоченная группа элементов одного типа. Язык PL/SQL поддерживает три вида коллекций:
  • вложенные таблицы (nested tables);
  • индексированные таблицы;
  • varray-массивы (variable-size arrays).
Доступ к любому элементу вложенной таблицы или varray-массива осуществляется по его индексу, который указывается в скобках после имени переменной типа коллекции. Коллекция может быть передана в качестве параметра. Коллекцию можно использовать:
  • для обмена с таблицами баз данных и столбцами данных;
  • для передачи столбца данных из приложения клиента в хранимую процедуру или обратно.
Для создания коллекции следует определить тип коллекции - TABLE или VARRAY - и объявить переменную этого типа. Определение типа выполняется в секции объявлений блока PL/SQL, подпрограммы или пакета. Вложенные таблицы Определение типа вложенной таблицы может иметь следующее формальное описание: TYPE type_name IS TABLE OF element_type [NOT NULL]; Параметр type_name указывает имя определяемого типа, а element_type - это любой допустимый тип данных PL/SQL, исключая некоторые типы, в том числе VARRAY, TABLE, BOOLEAN, LONG, REF CURSOR и т.п. Вложенную таблицу можно рассматривать как одномерный массив, в котором индексами служат значения целочисленного типа в диапазоне от 1 до 2147483647. Вложенная таблица может иметь пустые элементы, которые появляются после их удаления встроенной процедурой DELETE. Вложенная таблица может динамически увеличиваться. Индексированные таблицы Индексированные таблицы позволяют работать со столбцами как с единой переменной - массивом. Определение индексированной таблицы (index-by tables) может иметь следующее формальное описание: TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER; Индексированная таблица - это вариант вложенной таблицы, в которой элементы могут иметь произвольные целочисленные значения индексов. Такой тип данных очень удобен, если в качестве индекса использовать значение первичного ключа. VARRAY-массивы Определение типа Varray-массива может иметь следующее формальное описание: TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL]; Параметр type_name указывает имя определяемого типа, size_limit - максимальное количество элементов, а element_type - это любой допустимый тип данных PL/SQL, исключая некоторые типы, такие как VARRAY, TABLE, BOOLEAN, LONG, REF CURSOR и т.п. Если типом элемента является тип запись, то каждое поле записи должно быть скалярного или объектного типа. Максимальное количество элементов в Varray-массиве указывается при определении типа и не может изменяться динамически. Доступ к каждому элементу Varray-массива осуществляется по индексу. Varray-массивы можно передавать в качестве параметров. Varray-массивы не могут иметь пустот, так как для них нет операции удаления произвольного элемента массива. Например: DECLARE TYPE d1 IS VARRAY(365) OF DATE; TYPE rec1 IS RECORD (v1 VARCHAR2(10), v1 VARCHAR2(10)); TYPE arr_rec IS VARRAY(250) OF rec1; -- Массив записей TYPE F1T1 IS TABLE OF tbl1.f1%TYPE; -- Вложенная таблица CURSOR c1 IS SELECT * FROM tbl1; TYPE t1 IS VARRAY(50) OF c1%ROWTYPE; -- Массив записей, -- основанный на курсоре TYPE t2 IS TABLE OF tbl1%ROWTYPE INDEX BY BINARY_INTEGER; -- Индексированная таблица rec_t2 t2; -- Объявление переменной BEGIN /* Использование переменной типа индексированная таблица */ SELECT * INTO rec_t2(120) WHERE f1 = 120; END; Инициализация коллекций Для инициализации коллекции используется конструктор - автоматически создаваемая функция, одноименная с типом коллекции. Конструктор создает коллекцию из значений переданного ему списка параметров. Конструктор может быть вызван как в секции объявлений через знак присваивания после указания типа, так и в теле программы. Вызов конструктора без параметров означает инициализацию коллекции как пустой, но не устанавливает ее равной NULL. Например: DECLARE CREATE TYPE rec_var1 AS VARRAY(3) OF num; CREATE TYPE rec_var2 AS VARRAY(3) OF rec_obj; r1 rec_var1; r2 rec_var2; BEGIN /* Инициализация коллекции из трех элементов */ r1 := rec_var1 (2.0, 2.1, 2.2); /*Инициализация varraj-массива, содержащего объекты типа rec_obj */ r2 := rec_var2 (rec_obj(1, 100, 'fff'), rec_obj (2,110, 'ggg'), rec_obj (3,120, 'jjj')); Оператор CREATE TYPE позволяет сохранить определяемый тип в базе данных. Конструктор можно вызывать в любом месте, где допустим вызов функции. Для того чтобы добавить в таблицу базы данных строку, одно из полей которой имеет тип коллекции, следует использовать конструктор. Например: BEGIN INSERT INTO tbl_coll VALUES (1, 'aaa', rec_obj (3,120, 'jjj'));
Методы, применяемые для работы с коллекциями В PL/SQL реализован ряд встроенных методов для работы с коллекциями. Эти методы вызываются как: collection_name.method_name[(parameters)] Эти методы нельзя вызывать из SQL-оператора. В следующей таблице приведено описание встроенных функций, используемых для работы с коллекциями.
Метод Описание
EXISTS(n) Если n-ый элемент коллекции существует, то функция возвращает значение TRUE
COUNT Функция возвращает реальное количество элементов, которые содержит коллекция
LIMIT Функция возвращает размер varray-массива или NULL - для вложенных таблиц
DELETE(m,n) Эта процедура удаляет элементы из вложенной или индексированной таблицы. Если параметров не задано, то удаляются все элементы коллекции.При задании параметра n удаляется n-ый элемент вложенной таблицы, а если задано оба параметра, то удаляются все элементы в диапазоне от n до m
FIRST, LAST Функции возвращают наименьший и наибольший индекс элементов коллекции. Для пустой вложенной таблицы обе функции возвращают значение NULL. Для varray-массивов вызов функции FIRST всегда возвращает значение 1
PRIOR(n) Эта функция используется для цикла или последовательного просмотра элементов вложенных таблиц и возвращает индекс элемента, предшествующего указанному параметром n. Если такого элемента нет, то возвращается значение NULL
NEXT(n) Функция употребляется для цикла или последовательного просмотра элементов вложенных таблиц и возвращает индекс элемента, следующего за указанным параметром n. Если такого элемента нет, то возвращается значение NULL
EXTEND(n,i) Функция увеличивает размер вложенной или индексированной таблицы, позволяя добавлять в конец коллекции как один элемент, так и несколько элементов.Если параметров не задано, то в коллекцию добавляется один null-элемент, а если указан только параметр n, то добавляются n null-элементов. Если задано оба параметра, то добавляются n элементов, являющихся копиями i-го элемента коллекции
TRIM(n) Функция выполняет удаление одного или нескольких элементов вложенной или индексированной таблицы. Если параметров не указано, то удаляется один последний элемент, а при задании параметра удаляются n последних элементов коллекции. Если значение параметра превышает реальное количество элементов, возвращаемое функцией COUNT, то инициируется исключение.Если элемент был ранее удален функцией DELETE, то он все равно будет входить в число удаляемых функцией TRIM элементов

Применение функций TRIM и EXTEND реализует для вложенных таблиц механизм стека, позволяя удалять элементы и добавлять их в конец вложенной таблицы. Функция DELETE выполняет удаление элементов, оставляя пустые места, которые впоследствии учитываются функцией TRIM.



Значение, возвращаемое функцией COUNT, может использоваться как максимальное значение для счетчика цикла по элементам коллекции.

Например:

FOR i IN 1..tbl1.COUNT LOOP
END LOOP;

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

Для Varray-массивов значение, возвращаемое функцией COUNT, эквивалентно значению, возвращаемому функцией LAST. Для вложенных таблиц эти значения могут быть различны в том случае, если выполнялась процедура DELETE, удаляющая элементы из коллекции.

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

Например:

DECLARE
TYPE cl IS TABLE OF VARCHAR2(10); -- Вложенная таблица
c1 cl;
BEGIN
c1 := cl('с 1', 'с 2', 'с 3'); -- Инициализации
-- коллекции конструктором
c1.DELETE(c1.LAST); -- Удаление последнего (3-го) элемента
c1.TRIM(c1.COUNT); -- Удаление двух последних элементов:
-- (2-го и 3-го)
DBMS_OUTPUT.PUT_LINE(c1(1)); -- Запись в поток
-- вывода значения 'с 1'
END;

Если при работе с коллекцией происходит ошибка, то Oracle инициирует бросок исключения. В следующей таблице приведены основные причины возникновения ошибок для коллекций.

Исключение Причина ошибки
COLLECTION_IS_NULL Коллекция не была инициализирована
NO_DATA_FOUND Индекс ссылается на ранее удаленный элемент коллекции
SUBSCRIPT_BEYOND_COUNT Индекс больше, чем количество элементов в коллекции
SUBSCRIPT_OUTSIDE_LIMIT Индекс не принадлежит допустимому диапазону значений индекса
VALUE_ERROR Значение индекса равно NULL или не может быть преобразовано в целое

Исключительная ситуация не инициируется, если для процедуры DELETE в качестве параметра передан индекс, равный NULL, а также при указании индекса ранее удаленного элемента в случае его замещения.

Записи Записью называется набор элементов, хранимых в полях записи. Каждое поле имеет свое имя и тип. Записи нельзя сравнивать на равенство или неравенство и на эквивалентность значению NULL. Запись может быть объявлена на базе существующей структуры таблицы или как новый тип. Для объявления записи, имеющей структуру, соответствующую строке таблицы базы данных, используется атрибут %ROWTYPE. Объявление нового типа запись может иметь следующее формальное описание: TYPE type_name IS RECORD (field_declaration[, field_declaration]...); Описание поля ( field_declaration) указывается как: field_name field_type [[NOT NULL] {:= | DEFAULT} expression] Параметр type_name задает имя определяемого типа; field_type указывает тип поля как любой тип PL/SQL за исключением REF CURSOR; expression определяет значение инициализации. Как и для коллекций, для создания записи следует сначала определить тип RECORD, а затем объявить запись данного типа. Тип запись существует только на время выполнения программы и не может быть сохранен в базе данных в отличие от типов TABLE и VARRAY. Для доступа к любому полю записи используется следующая нотация: record_name.field_name. Если field_name также является записью, то для доступа к его вложенному полю используется та же нотация: record_name.field_name. field1_name и т.д. В выражениях языка PL/SQL выполнять присваивание значения можно как отдельно полю, так и всей записи. Выполнять присвоение значения всей записи можно двумя способами:
  • использовать в качестве присваиваемого значения запись того же типа;
  • задать запись в качестве INTO-переменной в SQL-операторе SELECT или FETCH.
Например: DECLARE TYPE T_rec IS RECORD ( -- Определение типа f1 tbl1.f1%TYPE, f2 VARCHAR2(15), f3 REAL(7,2)); rec3 tbl1%ROWTYPE; -- Тип на основе строки таблицы rec1 T_rec; -- Объявление записи f_sum1 REAL; FUNCTION sum_f3 (n INTEGER) RETURN T_rec IS rec2 T_rec; BEGIN -- … -- Функция возвращает значение типа запись RETURN rec2; END; BEGIN rec1 := sum_f3(4); -- Вызов функции f_sum1 := sum_f3(4).f3; SELECT * INTO rec3 FROM tbl1 WHERE f1 = 1; END;


<== предыдущая лекция | следующая лекция ==>
Операторы цикла | Лекция №13: Объектно-ориентированное программирование в PL/SQL


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.607 сек.