Выбрать главу

До появления Огас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, которые показаны в