До появления Огас1е8 единственным вариантом хранения больших
объемов символьных или двоичных данных было использование типов
LONG и LONG RAW (для двоичных файлов размером менее 4 килобайт можно
было использовать и тип RAW). Типы L0B имеют три преимущества перед
более старыми типами:
494 Глава 14
■ LOB могут хранить в себе до 128 Тбайт данных. Это намного больше
того объема данных, который можно было хранить в столбцах LONG
и LONG RAW (не более 2 Гбайт).
■ В т а б л и ц е м о ж е т б ы т ь н е с к о л ь к о L0B с т о л б ц о в , в т о в р е м я к а к с т о л б
е ц LONG и л и LONG R A W м о ж е т б ы т ь т о л ь к о о д и н в т а б л и ц е .
■ К данным L0B можно обращаться в произвольном порядке, а к данным
LONG и LONG R A W возможен только последовательный доступ.
L0B состоит из двух частей:
■ Локатор L0B Указатель, который определяет местонахождение содержимого
L0B,
■ Содержимое L0B Непосредственно байты или символы, записанные
в L0B.
В зависимости от количества данных, сохраняемых в столбце CL0B,
NCL0B или BLOB, реальные данные будут записаны либо в таблице, либо вне
ее. Если размер данных не превышает 4 Кбайт, данные будут записаны в
той же таблице; иначе.данные будут записаны вне таблицы. Для столбцов
типа BFILE в базе данных всегда хранятся только локаторы; локатор указывает
на внешний файл, сохраняемый в файловой системе.
Создание таблиц, содержащих большие объекты
Для примеров в этом разделе будут использованы три таблицы:
■ таблица clob_content, содержащая столбец clob_column типа CL0B;
■ таблица blob_content, содержащая столбец blob_column типа BLOB;
■ таблица bfile_content, содержащая столбец bfile_column типа BFILE.
В каталоге SQL, куда вы поместили разархивированные файлы для этой
книги, есть сценарий SQITPlus lob_schema.sql. Этот сценарий можно выполнять
в среде Огас1е8 или более поздних версий базы данных. Сценарий
создает пользователя lob_user с паролем lob_password, а также таблицы и
код PL/SQL, который используется в первой части этой главы. После завершения
сценария вы будете загружены под пользователем lob_user.
Три таблицы определяются следующим образом:
□ CREATE TABLE c lo b _ c o n t e n t (
id INTEGER PRIMARY KEY,
c lo b _ c o lum n CLOB NOT NULL
); CREATE TABLE b lo b _ c o n t e n t (
id INTEGER PRIMARY KEY,
b lo b _ c o lumn BLOB NOT NULL
); CREATE TABLE b f i l e _ c o n t e n t (
i d INTEGER PRIMARY KEY,
b f i l e _ c o lu r r n BFILE NOT NULL
);
Большие объекты 495
Использование больших объектов в SQL
В этом разделе вы увидите, как манипулировать большими объектами при
помощи SQL. Мы начнём с рассмотрения объектов CL0B и BLOB, а затем
перейдём к объектам BFILE.
Использование CL0B и BLOB
В следующих разделах показано, как заполнить объекты CL0B и BLOB данными,
получить данные и затем изменить данные.
Заполнение C LO B и B LO B данными
Следующие операторы INSERT добавляют две строки в таблицу c lo b _
c o n t e n t . Обратите внимание на использование функции T 0 _ C L 0 B ( ) для преобразования
текста в С L0 В:
□ INSERT INTO c lo b _ c o n t e n t (
id , c lo b _ c o lum n
) VALUES (
1, T 0 _ C L 0 B ( ‘ C re e p s in t h i s p e t t y p a c e ’ )
);
INSERT INTO c lo b _ c o n t e n t (
id , c lo b _ c o lu n in
) VALUES (
2, T 0 _ C L 0 B ( ‘ from day t o d a y ’ )
);
Следующие выражения INSERT добавляют две строки в таблицу b lo b_
content. Обратите внимание на использование функции T0 _ B L 0B ( ) , которая
преобразует числа в BLOB (первое выражение содержит двоичное число,
а второе - 16-ричное):
□ INSERT INTO b lo b _ c o n t e n t (
id , blo b _ co lumn
) VALUES (
1, TO_BLOB(‘ 100111010101011111 ’ )
);
INSERT INTO b lo b _ c o n t e n t (
id , blo b _ co lumn
) VALUES (
2, T 0 _ B L 0 B ( ‘ A0FFB71CF90DE' )
);
Выборка данных из C LO B
Следующий запрос производит выборку строк из таблицы c lo b _ c o n t e n t :
□ SELECT *
FROM c lo b _ c o n t e n t ;
ID CL0B_C0LUMN
1 C re e p s i n t h i s p e t t y pace
2 from day t o day
496 Глава 14
Следующий запрос пытается получить содержимое таблицы b lo b—
content и завершается аварийно:
П SELECT *
FROM b lo b _ c o n t e n t ;
SP2 -0 67 8 : Column o r a t t r i b u t e t y p e can n o t be d i s p l a y e d by SQL * P lu s
(S P 2 -0 6 7 8 : Тип с толбца или а три б у та не может быт отображен в SQL * P lu s )
Этот пример не работает, потому что SQL? Plus не в состоянии отобразить
двоичное содержимое BLOB. (О том, как обращаться к содержимому
столбца BLOB, см. ниже в разделе “Использование больших объектов в PL/
SQL’.)
Вы, однако, можете получить не-BLOB столбцы таблицы:
П SELECT id
FROM b lo b _ c o n t e n t ;
ID
12
Изменение данных тв C LO B и B LO B
Не бойтесь запустить выражения UPDATE и INSERT, которые показаны в