Пример таблицы, рассмотренной выше не вполне реалистичен, так как размер документов в нем ограничивался максимум четырьмя тысячами байтов для типа VARCHAR2. В то же время Oracle позволяет создавать индекс типа CTXSYS.CONTEXT еще на поля типа CLOB, XMLTYPE и даже BFILE и URITYPE.
Это тип данных впервые реализован в ORACLE 8. Появление этого типа данных явилось своего рода революцией — граница межу базой данных и окружающей средой стала весьма прозрачной: информация в базе данных теперь может храниться практически любая, как по размеру, так и по содержимому.
Основные типы больших объектов:
Blob – неструктурированные двоичные данные
Clob – символьные данные
Bfile – внешние файлы операционной системы, содержащие двоичные данные.
Blob, Clob – это внутренние большие объекты, то есть данные хранятся в базе данных.
Bfile – это внешние большие объекты, данные хранятся вне базы данных.
Как внутренние, так и внешние большие объекты могут быть использованы как столбцы таблицы, как переменные в pl/sql, как атрибуты объектов.
LOB - объект состоит из локатора и значения. Локатор – это внутренний указатель на фактическое значение большого объекта. Значение – это реальное содержимое объекта.
Доступ к значениям больших объектов осуществляется только с помощью соответствующего локатора.
BLOB, CLOB – это внутренние большие объекты. Основные правила работы с этими объектами:
В основу работы с этими объектами положена транзакция, то есть любое изменение может быть зафиксировано или отменено.
Фактическое значение столбца LOB может храниться как часть строки таблицы, либо отдельно. Если длина столбца LOB больше 4000 байт, значение автоматически переносится в другое место.
Есть три состояния большого объекта: может быть пустым, может иметь значение null, может иметь какое-то конкретное значение. NULL – нет ни локатора ни значения у объекта. Пустой объект – имеется локатор, но он указывает на пустое место в базе данных.
Переменные и атрибуты объекта LOB могут играть роль промежуточного хранилища для локаторов LOB, указывающих на реальное значение в базе данных. То есть только столбец таблицы может содержать значение объекта LOB. Переменная Lob не представляет никакого фактического значения. Переменная содержит только локатор, соответствующий столбцу lob в базе данных.
У каждого LOB–столбца есть отдельный локатор и отдельное значение. То есть, если вы lob–столбцу присваиваете значение другого Lob-столбца, то этот столбец получает новое значение и новый локатор.
Непротиворечивость чтения внутренних больших объектов обеспечивается с помощью собственных механизмов многовариантности.
58. Создайтетаблицу: SQL>CREATE TABLE docs2 ( doc_id NUMBER ( 10 ), clobdoc CLOB);
59. Запустите Oracle SQL Developer: откройтекаталог C:\Program Files\sqldeveloper, выберите sqldeveloper.exe, М 2.
60. Создайтесоединение: выберите Connections, МП , выберите New database connection, вполе Connection Name введитесвойлогин, например, ctx2, вполе Name введитесвойлогин, например, ctx2, вполе Password введитесвойпароль, например, ctx2, вполе hostname введите 192.168.100.101, вполе SID введите enisey, нажмите Connect.
61. Найдите в Интернете текст любой русской сказки.
62. Введите данные в таблицу: выберите ctx2, выберите tables, выберите docs2, выберите вкладку Data, нажмите Insert Row , в поле DOC_ID введите цифру, например, 1, в поле CLOBDOC выберите три точки, вставьте из буфера обмена скопированную туда найденную сказку, нажмите ОК.
63. Выберите Commit Changes
64. Создайтеиндекс:
SQL>CREATE INDEX docs_clobdoc_idx ON docs2 ( clobdoc ) INDEXTYPE IS ctxsys.context;
65. Поищите, чтонибудь:
SQL> SELECT CONTAINS ( clobdoc, 'рыбак%' ) AS score FROM docs2;