Oracle и PL/SQL поддерживают несколько разновидностей типов данных, предназначенных специально для работы с большими объектами (LOB, Large OBjects
). Такие объекты позволяют хранить огромные (от 8 до 128 терабайт) объемы двоичных (например, графических) или текстовых данных.
До выхода Oracle9i Release2 в объектах LOB
можно было хранить до 4 Гбайт данных. Начиная с Oracle10g, ограничение было повышено до величины от 8 до 128 терабайт (конкретное значение зависит от размера блока вашей базы данных).
В PL/SQL можно объявлять большие объекты четырех типов:
BFILE
— двоичный файл. Переменная этого типа содержит локатор файла, указывающий на файл операционной системы вне базы данных. Oracle интерпретирует содержимое файла как двоичные данные.BLOB
— большой двоичный объект. Переменная этого типа содержит локаторLOB
, указывающий на большой двоичный объект, хранящийся в базе данных.CLOB
— большой символьный объект. Переменная этого типа содержит локаторLOB
, указывающий на хранящийся в базе данных большой блок текстовых данных в наборе символов базы данных.NCLOB
— большой символьный объект с поддержкой символов национальных языков (NLS
). Переменная этого типа содержит локаторLOB
, указывающий на хранящийся в базе данных большой блок текстовых данных с национальным набором символов.
Большие объекты можно разделить на две категории: внутренние и внешние. Внутренние большие объекты (типы BLOB, CLOB
и NCLOB
) хранятся в базе данных и могут участвовать в транзакциях на сервере базы данных. Внешние большие объекты (тип BFILE
) представляют двоичные данные, хранящиеся в файлах операционной системы вне таблиц базы данных. Они не могут участвовать в транзакциях, то есть вносимые в них изменения нельзя сохранить или отменить в зависимости от результата транзакции. Целостность данных обеспечивается только на уровне файловой системы. Кроме того, повторное чтение из BFILE
может приводить к разным результатам — в отличие от внутренних больших объектов, соответствующих модели логической целостности чтения.
LONG И LONG RAW
Вероятно, спецы, знакомые с Oracle, заметили, что мы до сих пор не упоминали о типах данных LONG
и LONG RAW
. И это не случайно. Конечно, в столбцах типа LONG
и LONG RAW
базы данных можно хранить большие объемы (до 2 Гбайт) соответственно символьных и двоичных данных. Однако максимальная длина соответствующих им переменных PL/SQL значительно меньше: всего лишь 32 760 байт, что даже меньше длины переменных VARCHAR2
и RAW
(32 767 байт). С учетом столь странного ограничения в программах PL/SQL лучше использовать переменные типа VARCHAR2
и RAW
, а не типа LONG
и LONG RAW.
Значения типов LONG
и LONG RAW
, извлекаемые из базы данных и содержащие более 32 767 байт данных, не могут присваиваться переменным типа VARCHAR2
и RAW
. Это крайне неудобное ограничение, из-за которого типы LONG
и LONG RAW
лучше вообще не применять.
Эти типы официально считаются устаревшими и поддерживаются только для сохранения обратной совместимости кода. Компания Oracle не рекомендует ими пользоваться, и я с ней полностью согласен. В новых приложениях вместо них лучше использовать типы CLOB
и BLOB
. А для существующих приложений в документации Oracle SecureFiles and Large Objects Developer’s Guide
приводятся рекомендации по преобразованию данных типа LONG
в данные типа LOB
.