Обзор типов данных PL/SQL

Обзор типов данных языке программирования PL/SQLПри объявлении переменной или константы необходимо задать ее тип данных (PL/SQL, за некоторыми исключениями, относится к языкам со статической типизацией — см. ниже врезку). В PL/SQL определен широкий набор скалярных и составных типов данных; кроме того, вы можете создавать пользовательские типы данных. Многие типы данных PL/SQL (например, BOOLEAN и NATURAL) не поддерживаются столбцами баз данных, но в коде PL/SQL эти типы весьма полезны.

Практически все заранее определенные типы данных определяются в пакете PL/SQL STANDARD. Например, определение типа данных BOOLEAN и двух числовых типов данных может выглядеть так: 



create or replace package STANDARD is
type BOOLEAN is (FALSE, TRUE);
type NUMBER is NUMBER_BASE;
subtype INTEGER is NUMBER(38,);

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


ЧТО ТАКОЕ «СТАТИЧЕСКАЯ ТИПИЗАЦИЯ »?

Статической (или сильной) типизацией называется проверка типов во время компиляции (а не на стадии выполнения программы). К числу языков программирования, использующих сильную типизацию, относятся PL/SQL, Ada, C и Pascal. Языки с динамической типизацией (такие, как JavaScript, Perl или Ruby) выполняют большинство проверок типов во время выполнения. Статическая типизация позволяет выявлять ошибки во время компиляции, что повышает надежность программ. Преимуществом статической типизации является и ускорение выполнения программ. Оптимизирующий компилятор, который знает точные типы данных, может подбирать более эффективные ассемблерные решения и генерировать высокооптимизированный машинный код. Динамическая типизация тоже обладает своими преимуществами: например, метаклассы и интроспекция проще реализуются на базе динамической типизации.


 

Символьные типы данных

PL/SQL поддерживает строки фиксированной и переменной длины, состоящие как из традиционных символов, так и из символов Юникода. К строкам первого типа относятся строки CHAR и NCHAR, а к строкам второго вида — VARCHAR2 и NVARCHAR2. Объявление строки переменной длины, которая может содержать до 2000 символов, выглядит так: 

DECLARE
l_accident_description VARCHAR2(2000);

Для очень длинных символьных строк в PL/SQL предусмотрены типы данных CLOB (Character Large Object) и NCLOB (NLS Character Large Object). По соображениям совместимости PL/SQL также поддерживает тип данных LONG. Эти типы данных позволяют сохранять и обрабатывать очень большие объемы данных; так, в Oracle11g тип LOB способен хранить до 128 терабайт информации.

Использование типа LONG ограничивается множеством правил. Мы не рекомендуем применять его в Oracle8 и последующих версиях.

 

Числовые типы данных

В PL/SQL поддерживаются как вещественные, так и целочисленные типы данных. Тип NUMBER давно был основным типом для работы с числовыми данными; он может применяться для работы с целыми и вещественными данными как с фиксированной, так и с плавающей запятой. Пример типичного объявления NUMBER

/* Файл в Сети: numbers.sql */
DECLARE
salary NUMBER(9,2); -- фиксированная точка, семь цифр в целой части,
-- две в дробной части
raise_factor NUMBER; -- дробное с плавающей запятой
weeks_to_pay NUMBER(2); -- целое число
BEGIN
salary := 1234567.89;
raise_factor := 0.05;
weeks_to_pay := 52;
END;

Из-за своей внутренней десятичной природы тип NUMBER особенно удобен при работе с денежными суммами. В отличие от двоичного представления, ему не присущи ошибки округления. Например, если сохранить в нем значение 0.95, позднее вы прочитаете именно эту величину, а не приближенную (скажем, 0.949999968).

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

В Oracle10g появились два двоичных типа с плавающей запятой: BINARY_FLOAT и BINARY_DOUBLE. Как и NUMBER, эти двоичные типы данных поддерживаются и в PL/SQL, и в базах данных. Однако в отличие от NUMBER, эти типы хранят значение в двоичном виде, а следовательно, при работе с ними могут возникнуть погрешности округления. Типы BINARY_FLOAT и BINARY_DOUBLE поддерживают специальные значения NaN (Not a Number, «не является числом»), положительную и отрицательную бесконечность. В некоторых типах приложений эти типы обеспечивают огромный выигрыш в быстродействии, так как вычисления с этими двоичными типами по возможности выполняются на аппаратном уровне.

В Oracle11g появились еще две разновидности вещественных типов. Типы SIMPLE_FLOAT и SIMPLE_DOUBLE являются аналогами BINARY_FLOAT и BINARY_DOUBLE, но они не поддерживают NULL и не инициируют исключение в случае переполнения.

PL/SQL поддерживает несколько числовых типов и подтипов, не имеющих прямого соответствия среди типов баз данных, но все равно полезных. Особого внимания заслуживают PLS_INTEGER и SIMPLE_INTEGER. Операции с целочисленным типом PLS_INTEGER реализуются на аппаратном уровне. В частности, счетчики циклов FOR реализуются в формате PLS_INTEGER. Тип SIMPLE_INTEGER, появившийся в Oracle11g, обладает тем же диапазоном значений, что и PLS_INTEGER, но не поддерживает NULL и не инициирует исключение в случае переполнения. SIMPLE_INTEGER, как и SIMPLE_FLOAT с SIMPLE_DOUBLE, работает невероятно быстро — особенно с откомпилированным кодом.

Типы данных языка PL/SQL 

Дата, время и интервалы

До появления версии Oracle9i представление дат в Oracle ограничивалось типом DATE, в котором хранится дата и время (с округлением до ближайшей секунды). В Oracle9i были введены два новых типа данных, INTERVAL и TIMESTAMP, значительно расширившие возможности разработчиков в отношении операций с датами и временем в PL/ SQL, а также вычисления и хранения временных интервалов. Их использование продемонстрировано в функции, вычисляющей возраст человека в интервальном формате с точностью до месяца: 

/* Файл в Сети: age.fnc */
FUNCTION age (dob_in IN DATE)
RETURN INTERVAL YEAR TO MONTH
IS
BEGIN
RETURN (SYSDATE - dob_in) YEAR TO MONTH;
END;

 

Логические данные

PL/SQL поддерживает тип данных BOOLEAN. Переменные этого типа могут принимать одно из трех значений (TRUE, FALSE или NULL).

Логические переменные помогают писать понятный, легко читаемый код даже в тех случаях, когда он содержит очень сложные логические выражения. Пример объявления логической переменной с присваиванием ей значения по умолчанию: 

DECLARE
l_eligible_for_discount BOOLEAN :=
customer_in.balance > min_balance AND
customer_in.pref_type = 'MOST FAVORED' AND
customer_in.disc_eligibility;

 

Двоичные данные

Oracle поддерживает несколько разновидностей двоичных данных — неструктурированных данных, не интерпретируемых и не обрабатываемых Oracle. К их числу относятся типы RAW, BLOB и BFILE. Тип BFILE используется для хранения неструктурированных двоичных данных в файлах операционной системы вне базы данных. Тип RAW имеет переменную длину, а при операциях с ним Oracle не выполняет преобразование символов при передаче данных. В остальном он аналогичен символьному типу VARCHAR2.

Тип данных LONG RAW поддерживается для обеспечения обратной совместимости, но в PL/SQL поддержка данных LONG RAW ограничена. В базе данных Oracle столбец LONG RAW занимает до 2 Гбайт, но PL/SQL позволяет работать только с первыми 32 760 байтами LONG RAW. Если, например, вы попытаетесь выполнить выборку в переменную PL/SQL из столбца LONG RAW, превышающего лимит в 32 760 байт, произойдет ошибка:  

ORA-06502: PL/SQL: numeric or value error exception.

Для работы с данными LONG RAW, превышающими лимит PL/SQL, потребуется программа OCI; кстати, это веская причина для перевода старого кода с LONG RAW на данные BLOB, не имеющие такого ограничения.

 

Типы данных ROWID и UROWID

Oracle поддерживает два типа данных ROWID и UROWID, предназначенных для предоставления адреса строки в таблице. Тип ROWID представляет уникальный физический адрес строки в таблице, а тип UROWID — логическую позицию строки в индексной таблице (Index-Organized Table, IOT). Тип ROWID также является псевдостолбцом SQL, который может включаться в инструкции SQL.

 

Тип данных REF CURSOR

Тип данных REF CURSOR позволяет объявлять курсорные переменные, которые могут использоваться со статическими и динамическими SQL-командами для улучшения гибкости программного кода. Тип REF CURSOR существует в двух формах: сильной и слабой. PL/SQL относится к категории языков со статической типизацией, а слабый тип REF CURSOR является одной из немногочисленных конструкций с динамической типизацией.

В следующем примере объявления сильной формы REF CURSOR курсорная переменная связывается с конкретной структурой записи с помощью атрибута %ROWTYPE

DECLARE
TYPE book_data_t IS REF CURSOR RETURN book%ROWTYPE;
book_curs_var book_data_t;

Далее следуют два слабых объявления REF CURSOR, в которых переменная не связывается ни с какой конкретной структурой. Во втором объявлении (строка 4) представлен тип SYS_REFCURSOR — заранее определенный слабый тип REF CURSOR

DECLARE
TYPE book_data_t IS REF CURSOR;
book_curs_var book_data_t;
book_curs_var_b SYS_REFCURSOR;

 

Типы данных для поддержки интернет-технологий

В Oracle9i появилась встроенная поддержка ряда технологий и типов данных, связанных с Интернетом, в частности XML (eXtensible Markup Language) и URI (Universal Resource Identifier). В Oracle имеются специализированные типы для работы с данными XML и URI, а также специальный класс идентификаторов URI (DBUri-REF), который используется для доступа к базе данных. Кроме того, в Oracle появился новый набор типов данных, обеспечивающий хранение внешних и внутренних URI и обращение к ним из базы данных.

Тип XMLType предназначен для запроса и сохранения данных в формате XML. Для работы с XML используются такие функции, как SYS_XMLGEN из пакета DBMS_XMLGEN. Поддержка XPath и встроенные команды языка SQL позволяют выполнять поиск данных в документах XML.

Типы данных для работы с URI, включая URIType и HttpURIType, входят в иерархию объектных типов и могут использоваться для хранения URI внешних веб-страниц и файлов, а также для обращения к информации в базе данных.

 

Типы данных «Any»

Большая часть программного кода предназначается для решения узкоспециализированных задач. Однако иногда нам приходится писать более универсальные программы. Именно для таких ситуаций предназначены типы данных Any.

Эта группа типов данных, появившаяся в Oracle9i, заметно отличается от любых других типов данных Oracle. Типы данных Any позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL. С помощью этих объектных типов (и определенных для них методов) можно, к примеру, определить тип данных, хранимых во вложенной таблице, не обращаясь к объявлению типа этой таблицы!

В группу типов данных Any входят AnyType, AnyData и AnyDataSet.

 

Пользовательские типы данных

Из встроенных типов данных Oracle и пользовательских типов можно строить типы данных произвольной сложности, которые с большой точностью отражают структуру и поведение данных в конкретных системах. В базе данных Oracle они получили еще название абстрактных типов данных.

 

Вас заинтересует / Intresting for you:

Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 4633 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 14738 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 12238 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Символьные функции и аргументы...
Символьные функции и аргументы... 18545 просмотров Анатолий Wed, 23 May 2018, 18:54:01
Печать
Войдите чтобы комментировать