КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
ТИпы данных PL/SQL
Все типы определены в пакете STANDARD, где также содержатся встроенные SQL-функции и функции преобразования типов. Типы данных PL/SQL могут быть отнесены к одной из следующих категорий: 1) скалярные; 2) составные; 3) ссылочные; 4) объектные. Скалярные типы. Скалярным типом называют тип, содержащий одно значение. Скалярные типы делятся на подтипы: символьные (строковые), числовые, логические (булевы), дата-время. Символьные типы PL/SQL приведены в таблице: Таблица Символьные типы
Числовые типы PL/SQL приведены в таблице Таблица Числовые типы
К логическим (булевым) типам относится единственный тип BOOLEAN, который принимает значения TRUE, FALSE, NULL. К числу подтипов дата-время относятся типы DATE, TIMESTAMP, INTERVAL, которые практически совпадают с соответствующими типами БД.!!!! Составные типы. Составные типы отличаются от скалярных типов тем, что у них имеются внутренние компоненты – атрибуты. К составным типам относятся записи, вложенные таблицы, индексные таблицы и массивы переменной длины. Записи. Запись (record) – это составная структура данных, которая и по сути, и по структуре похожа на строку таблицы базы данных. Она состоит из нескольких элементов, называемых полями (fields). Запись в целом не имеет значения – значение имеет каждое отдельное поле, а запись предоставляет возможность хранения этих значений и доступ к ним как к группе. Для того чтобы использовать запись, необходимо определить её и объявить переменную такого типа. Существуют три типа записей: на основе таблицы, на основе курсора и определяемые программистом. Записи на основе таблицы и курсора не надо определять явно, т.к. они неявно определяются с той же структурой, что таблица или курсор. Переменные этих типов объявляются при помощи атрибута %ROWTYPE. Поля записей соответствуют столбцам таблицы или столбцам списка выборки для курсора.
DECLARE v_roomrecord rooms%ROWTYPE;
Записи, определяемые программистом, должны быть явно объявлены командой TYPE в секции объявлений PL/SQL или в спецификации пакета. Затем можно объявить переменные такого типа или использовать его как часть другого типа
DECLARE TYPE name_rectype IS RECORD (prefix VARCHAR2(15), fname VARCHAR2(15), lname VARCHAR2(30), suffix VARCHAR2(10));
new_emp_rec name_rectype;
Также можно создавать вложенные записи – это записи, состоящие из полей, которые представляют собой записи. Вложение записей – мощное средство нормализации структур данных и сокрытия сложности в программах PL/SQL. Инициализация записей. На отдельные поля записи можно ссылаться посредством точечной нотации:
имя_записи. имя_поля
Отдельные поля записи могут быть прочитаны и записаны. Они могут стоять как слева, так и справа от оператора присваивания. Запись целиком может быть присвоена другой записи того же типа, но сравнение двух записей при помощи логического оператора невозможно. Например, такое присваивание разрешено:
shipto_address_rec:=customer_address_rec;
Но приведенное ниже сравнение уже не разрешено (вместо этого следует сравнивать отдельные поля записей):
IF shipto_address_rec=customer_address_rec THEN .... END IF;
Присваивание значений записям и полям записей может выполняться четырьмя способами: 1. применить оператор присваивания для присваивания значений полю: new_emp_rec.hire_date:=SYSDATE;
2. выполнить SELECT INTO для целой записи или отдельных полей:
SELECT emp_id, dept, title, hire_date, college_recruit INTO new_emp_rec FROM emp WHERE surname=’LI’
3. выполнить FETCH INTO для целой записи или отдельных полей:
FETCH emp_cur INTO new_emp_rec;
FETCH emp_cur INTO new_emp_rec.emp_id, new_emp_rec.name;
4. присвоить все поля одной переменной записи другой переменной записи того же типа:
IF rehire THEN new_emp_rec:=former_emp_rec; ENDIF; Коллекции PL/SQL. Коллекция(collection) – это составная структура данных, которая ведёт себя как список или одномерный массив (PL/SQL не поддерживает традиционные массивы). В PL/SQL существует три типа коллекций: асcоциативные (индексные) массивы (associative arrays), вложенные таблицы (nested tables) и массивы переменной размерности (variable arrays) – VARRAY. Коллекции реализуются как типы (TYPE). Как и для других типов, определяемых пользователем, необходимо сначала определить тип, а затем объявить экземпляр такого типа. Определение типа может быть сохранено в БД или помещено в программу PL/SQL. Каждый экземпляр такого типа является коллекцией. Сравнение типов коллекций Таблица
Ассоциативный массив это одномерная неограниченная разреженная коллекция однородных элементов, которая доступна только в PL/SQL, но не в БД. Этот массив больше похож на списки и карты распределения в классических языках программирования, чем на обычные массивы. Ассоциативный массив может индексироваться при помощи типов BINARY_INTEGER, PLS_INTEGER или VARCHAR2. Он является ключом к использованию оператора FORALL или фразы BULK COLLECT, которые разрешают групповую пересылку данных из БД в программный модуль. Полный синтаксис:
CREATE [OR REPLACE] TYPE имя_типа IS TABLE OF тип_элемента [NOT NULL] INDEX BY [BINARY_INTEGER| PLS_INTEGER | VARCHAR2(размер)];
Ключевые слова: имя_типа – любой разрешённый идентификатор, который впоследствии будет использоваться для объявления коллекции. тип_элемента – это тип элементов коллекции. Все элементы должны быть одного типа; обычно бывает скалярный тип данных, объектный тип или ссылочный объектный тип. Если элементы представляют собой объекты, то сам объектный тип не может иметь в качестве атрибута коллекцию. К явно запрещённым типам данных элементов коллекций относятся BOOLEAN, NCHAR, NCLOB, NVARCHAR2, BCURSOR, TABLE и VARRAY. NOT NULL – означает, что в коллекции данного типа не может быть элементов со значением NULL. Однако она может быть атомарно пустой (неинициализированной).
Вложенная таблица – это одномерная неограниченная коллекция однородных элементов, доступная как и PL/SQL, так и в БД в виде столбца или таблицы. Вложенные таблицы изначально являются плотными (имеют последовательные индексы), но могут стать разреженными в результате удалений. Самыми близкими соответствиями со стандартными языками программирования для них являются множества и множества с повторяющимися элементами.
[CREATE [OR REPLACE]] TYPE имя_типа IS TABLE OF тип_элемента [NOT NULL];
Значения ключевых слов аналогичны aссоциативному массиву.
VARRAY – одномерная ограниченная коллекция однородных элементов, которая доступна как в PL/SQL, так и в БД. Массивы VARRAY всегда ограничены и никогда не бывают разреженными. В отличие от вложенных таблиц порядок их элементов сохраняется при сохранении их в БД и извлечении оттуда. Массив переменной длины является массивом в традиционном смысле языков программирования. Для ссылки на элементы структуры в них используются последовательные значения индексов
[CREATE [OR REPLACE]] TYPE имя_типа IS{VARRAY| VARYING ARRAY} (максимально_элементов) OF тип_элемента [NOT NULL];
Ключевые слова: максимально_элементов – это положительное целое число, которое задает максимальное количество элементов массива переменной длины и является обязательным для указания.
Создание коллекций. После объявления любой из представленных выше коллекций необходимо создать экземпляр коллекций следующим образом:
TYPE index_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; indtab intex_table;
где indtab – это экземпляр index_table. При помощи атрибута %TYPE коллекции можно связать с ней тип данных другой коллекции, например:
TYPE varray1 IS VARRAY(20) OF NUMBER; v1 varray1; v2 v1% TYPE;
Если определение v1 измениться, то вместе с ним изменится и определение v2. Функции и методы коллекций. Действия с коллекциями можно выполнить посредством следующих функций:
CAST – преобразует тип одной коллекции к типу другой коллекции, например:
SELECT column_value FROM table (SELECT CAST (colors AS color-tab_t) FROM color_models_a WHERE model_type=’RGB’);
MULTISET – отображает таблицу БД на коллекцию. Применяя MULTISET и CAST, можно извлекать строки из таблицы БД в виде столбца с типом коллекции. Можно применять MULTISET и CAST для извлечения вложенных столбцов и использования их в триггерной логике.
SELECT b.genus, b.species, CAST(MULTISET(SELECT bh.country FROM bird_ habitats bh WHERE bh.genus=b.genus AND bh.species=b.species) AS_ country_tab_t) FROM birds b;
TABLE – отображает коллекцию на таблицу БД; обратная функция к MULTISET.
SELECT * FROM color_models c WHERE ‘RED’ IN (SELECT *FROM TABLE (c. colors));
Посредством TABLE() можно преобразовать нерезидентную коллекцию: DECLARE birthdays Birthdate_t:= Birthdate_t(’24-SEP-1984’, ’19-JUN-1993’); BEGIN FOR the_rec IN (SELECT COLUMN_VALUE FROM TABLE (CAST(birthdays AS Birthdate_t)));
Коллекции также поддерживают ряд методов, приведенных в таблице Таблица
Для вызова этих методов применяется синтаксис точечной нотации:
имя_коллекции.имя_метода[(параметры)]
Добавление и удаление элементов. Можно добавить элементы в ассоциативный массив, просто сославшись на новые индексы. Для добавления элементов во вложенные таблицы или массивы VARRAY необходимо сначала увеличить коллекцию с помощью функции EXTEND, а затем присвоить новому элементу значение посредством одного из ранее представленных методов. Для удаления элемента вложенной таблицы, независимо от его позиции, применяется функция DELETE. Удалять элементы позволяет и функция TRIM, но только для удаления из конца коллекции. Не стоит использовать для одной коллекции DELETE и TRIM – результаты могут быть совсем не теми, которые вы ожидали. Вложенные коллекции. Вложенные коллекции – это коллекции, содержащие в элементах, которые являются членами коллекции. Вложенные коллекции представляют собой мощное средство реализации объектно-ориентированных программных конструкций в программах PL/SQL. Приведем простой пример определения вложенной коллекции:
CREATE TYPE books IS TABLE OF VARCHAR2(64); CREATE TYPE our_books IS TABLE OF books;
Инициализация коллекций. Объявление ассоциативного массива означает также и его инициализацию. Инициализация вложенной таблицы и массива VARRAY может быть выполнена следующим образом: - явно, при помощи конструктора; - неявно, посредством извлечения из БД; - неявно, посредством прямого присваивания другой переменной коллекции. Конструктор – это встроенная функция, имя которой совпадает с именем коллекции. Она создает коллекцию из переданных ей элементов. Например, можно создать вложенную таблицу цветов и явно инициализировать ее тремя элементами при помощи конструктора:
DECLARE TYPE color_tab_t IN TABLE OF VARCHAR2(30); colors_tab_t (‘RED’, ‘GREEN’, ‘BLUE’); BEGIN
Применяя второй способ инициализации, можно создать вложенную таблицу цветов и неявно инициализировать ее при помощи извлечения данных из БД:
--Создать хранение в БД тип вложенной таблицы. CREATE TYPE colors_tab_t IS TABLE OF VARCHAR2(32);
--Инициализировать коллекцию цветов данными из таблицы. DECLARE basic_colors colors_tab_t; BEGIN
SELECT colors INTO basic_colors FROM color_models WHERE model_type=’RGB’;
END;
Третий метод инициализации – инициализируем таблицу неявно, используя присваивание из существующей коллекции:
DECLARE basic_colors Color_tab_t:= Color_tab_t(‘RED’, ‘GREEN’, ‘BLUE’);
my_colors Color_tab_t;
BEGIN my_colors:=basic_colors; my_colors(2):=’MUSTARD’;
Ссылочные типы данных REF CURSOR и REF. Для хранения скалярных и составных типов переменных выделяется определенная область памяти. Переменная присваивает ей имя, по которому происходит ссылка на переменную. При этом нельзя отменить выделение памяти и одновременно сохранить возможность работы с переменной. Ссылочные типы обходят этот запрет, т.е. переменные, объявленные как ссылочные, могут указывать на различные области памяти. Переменные типа REF CURSOR называются курсорными переменными. Можно определить курсорную переменную как принадлежащую типу SYS_REFCURSOR и получать с ее помощью наборы данных из процедуры или функции. Например:
CREATE OR REPLACE PROCEDURE authors_sel (cv_results IN OUT SYS_ REFCURSOR) IS BEGIN OPEN cv_results FOR SELECT id, first_name, last_name FROM authors; END;
Проверку процедуры можно выполнить следующим образом:
VARIABLE x REFCURSOR EXEC authors_sel(:x) PRINT x
Тип REF используется с объектными типами. Значение REF следует представлять себе как указатель на экземпляр объекта в объектной таблице или объектном представлении. Объектные типы. Oracle поддерживает следующие четыре типа для больших объектов: BFILE – для внешнего двоичного файла, сохраняет указатели на объекты LOB, управляемые файловыми системами, внешними по отношению к СУБД; BLOB – для внутреннего двоичного объекта; CLOB – для внутреннего символьного объекта; NCLOB – для внутреннего символьного объекта, учитывающего национальный набор символов. Типы LOB от типа LONG отличаются, главным образом, тем, что при выборе значения любого LOB-типа посредством оператора SELECT возвращается указатель, а не само значение; кроме того, типы LOB могут быть и внешними. Любой объект LOB состоит из двух частей: данных и указателя на эти данные, называемого локатором. Типы BLOB, CLOB или NCLOB могут использоваться как для столбца базы данных, так и для переменной PL/SQL. Для загрузки объекта LOB предусмотрен пакет PL/SQL DBMS_LOB. Процедуры и функции для работы с LOB-типами приведены в таблице Таблица
Дата добавления: 2014-01-04; Просмотров: 6670; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |