Типы данных PL/SQL

Стас Белков

Стас Белков

Автор статьи. Известный специалист в мире IT. Консультант по продуктам и решениям Oracle. Практикующий программист и администратор баз данных. Подробнее.

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



Все имеющиеся предопределенные типы данных определены в PL/ SQL-пакете STANDARD. Например, туда включены операторы, определяющие логический тип данных и два числовых типа:

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

PL/SQL поддерживает строки как фиксированной, так и переменной длины, представленные как в традиционных кодировках, так и в кодировках Unicode. CHAR и NCHAR - это типы строк фиксированной длины, а VARCHAR2 и NVARCHAR2 - типы строк переменной длины. Рассмотрим объявление строки переменной длины, которая может вмещать до 2000 символов:

DECLARE
   l_accident_description VARCHAR2(2000); 

Oracle также поддерживает очень длинные символьные строки - типы LONG и LOB. Эти типы данных позволяют хранить и обрабатывать огромные объемы данных: LOB может содержать до 128 терабайт информации в Oracle Database 10g (используйте тип LONG только для совместимости с уже существующим кодом. Будущее за типами LOB!). К символьным типам данных LOB относятся CLOB (character large object - большой символьный объект) и NCLOB (National Language Support character large object - большой символьный объект с поддержкой национальных языков, многобайтный формат).

 

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

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

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.

До выпуска версии Oracle Database 10g тип NUMBER был единственным числовым типом данных PL/SQL, полностью соответствующим типу данных базы данных. Это одна из причин столь широкого использования типа NUMBER. В Oracle Database 10g появилось еще два двоичных типа с плавающей точкой: BINARY_FLOAT и BINARY_DOUBLE. Как и NUMBER, оба новых типа поддерживаются как в PL/SQL, так и в базе данных. Правильно применяя их, можно добиться значительного повышения производительности за счет того, что математические операции над новыми типами выполняются аппаратной частью (когда это позволяет аппаратная платформа).

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

 

Даты, временные метки и интервалы в PL/SQL

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

Приведем в качестве примера функцию, вычисляющую возраст человека:

CREATE OR REPLACE FUNCTION age (dob_in IN DATE)
   RETURN INTERVAL YEAR TO MONTH IS
   retval INTERVAL YEAR TO MONTH;
BEGIN
   RETURN (SYSDATE - dob_in) YEAR TO MONTH;
END; 

 

Логические типы данных PL/SQL

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

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

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

 

Двоичные данные PL/SQL

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

 

ROWID

Oracle поддерживает два собственных типа данных, ROWID и UROWID, которые используются для представления адреса строки в таблице. ROWID - это уникальный адрес строки в соответствующей таблице, а UROWID - логическая позиция строки в индекс-таблице (index-organized table, IOT). ROWID также является SQL-псевдонимом, который может использоваться в командах SQL.

 

REF CURSOR

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

Рассмотрим пример объявления строгого типа REF CURSOR (ассоциируем курсорную переменную с конкретной записью при помощи атрибута %ROWTYPE): 

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

Теперь рассмотрим два объявления нестрогого типа REF CURSOR, в которых никакая конкретная структура не ассоциируется с результирующей переменной. В четвертой строке представлен SYS_REFCURSOR, пред¬определенный нестрогий тип REF CURSOR. 

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

 

Типы данных для сети Интернет в PL/SQL

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

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

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

 

Типы данных «Any» PL/SQL

Обычно перед программистом стоит вполне конкретная задача с жестко заданными требованиями. Но случается и так, что необходимо написать нечто общее, для широкого применения. В таких случаях удобно использовать типы данных «Any».

Типы «Any» появились в версии Oracle9/ Database Release 1. Они значительно отличаются от любых других типов данных, доступных в Oracle. Эти типы позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL, а также обращаться к таким объектам. Вы можете использовать эти типы (и методы, определенные для них как для объектных типов), например для определения типа данных, хранящихся в некоторой вложенной таблице, без обращения к реальному объявлению типа данной таблицы.

Группа типов данных «Any» включает в себя AnyType, AnyData и Any- DataSet.

 

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

Oracle Text и PL/SQL: многоязы...
Oracle Text и PL/SQL: многоязы... 1289 просмотров Максим Николенко Fri, 18 Oct 2019, 12:41:03
Сопровождение объектных типов ...
Сопровождение объектных типов ... 1933 просмотров Максим Николенко Sun, 03 Nov 2019, 09:18:04
 Версии PL/SQL и Oracle 12c
Версии PL/SQL и Oracle 12c 2440 просмотров Александров Попков Tue, 21 Nov 2017, 13:28:01
Структура блока PL/SQL
Структура блока PL/SQL 5575 просмотров Илья Дергунов Tue, 10 Jul 2018, 06:35:51
Войдите чтобы комментировать

Myk аватар
Myk ответил в теме #9247 07 окт 2018 16:05
Мне понравилось. Без жевания соплей, - лишнего нет, но и сути не упустил. Зачетное объяснение типов ПиЭля..
Oracle_Admin аватар
Oracle_Admin ответил в теме #9040 13 мая 2018 04:58
Про абстрактные типы данных хорошо написано вот в этой статье .
apv аватар
apv ответил в теме #9036 09 мая 2018 09:58
Хороший обзор типов данных PL / SQL. Можно было добавить побольше инфы про пользовательские (абстрактные) типы данных. Но итак очень достроенный пост блога!