Русские Блоги
Значение и различие типов данных больших объектов blob, clob, nclob в Oracle
Один, blob 、 clob 、 nclob Что означает?
3 . LOB Есть несколько типов, в зависимости от типа байтов, которые вы используете, Oracle 8i Действительно сохранить эти данные в базе данных для сохранения. Специальные операции, такие как чтение, хранение и запись могут быть выполнены.
4 . CLOB(Character Large Object) Используется для хранения символьных данных, соответствующих набору символов, определенному базой данных. (Похожий на long Типы)
5 . BLOB(Binary Large Object) Может использоваться для хранения неструктурированных двоичных данных. (Похожий на row с long row )
два, LOB из BLOB 、 CLOB 、 BFILE Каковы различия и для чего они используются? Как это сделать?
LOB Состоит из двух частей: данные (значение) и указатель на данные (локатор). Хотя значение хранится в самой таблице, но один LOB Столбец не содержит значения, только его позиционный указатель. Кроме того, чтобы использовать большие объекты, программа должна объявить локальные переменные типа локатора. когда LOB (Помимо BFILE ) Когда он создается, локатор сохраняется в столбце, значение сохраняется в LOB В этом абзаце LOB Сегменты являются частью таблиц в базе данных. когда BFILE При создании локатор сохраняется в столбце как обычно.
три, blob с clob Какой максимум? Или нет максимального ограничения?
Их максимальный предел 4G , Clob Может хранить однобайтовые символьные данные, Blob Может хранить неструктурированные двоичные данные.
Большие объекты данных в PL/SQL: BLOB, CLOB, NCLOB и BFILE

До выхода Oracle9i Release2 в объектах LOB можно было хранить до 4 Гбайт данных. Начиная с Oracle10g, ограничение было повышено до величины от 8 до 128 терабайт (конкретное значение зависит от размера блока вашей базы данных).
В PL/SQL можно объявлять большие объекты четырех типов:
Большие объекты можно разделить на две категории: внутренние и внешние. Внутренние большие объекты (типы BLOB, CLOB и NCLOB ) хранятся в базе данных и могут участвовать в транзакциях на сервере базы данных. Внешние большие объекты (тип BFILE ) представляют двоичные данные, хранящиеся в файлах операционной системы вне таблиц базы данных. Они не могут участвовать в транзакциях, то есть вносимые в них изменения нельзя сохранить или отменить в зависимости от результата транзакции. Целостность данных обеспечивается только на уровне файловой системы. Кроме того, повторное чтение из BFILE может приводить к разным результатам — в отличие от внутренних больших объектов, соответствующих модели логической целостности чтения.
LONG И LONG RAW
/привет/мир/etc
Непериодические заметки о программировании
понедельник, 25 мая 2015 г.
О работе с большими объектами в СУБД Oracle
Указанные типы данных можно использовать в СУБД Oracle для определения столбцов таблиц, атрибутов объектных типов и переменных PL/SQL.
Вот краткая характеристика этих типов:
Итак, по месту хранения LOB’ы делятся на
а по содержанию на
Для работы с LOB’ами cоздам таблицу со столбцами соответствующих типов:
Вместе с таблицей были созданы сегменты для хранения больших объектов:
Значение типа LOB может быть
Пустые LOB значения создаются функциями EMPTY_CLOB и EMPTY_BLOB :
Начиная с версии Oracle 9i в SQL и PL/SQL поддерживается неявная конвертация между (N)CLOB и VARCHAR2, что позволяет манипулировать значениями в (N)CLOB столбцах и переменных так, как будто это значения типа VARCHAR2:
Как видим, функции и операторы, работающие с VARCHAR2, перегружены для типа (N)CLOB! При этом преодолеваются ограничения в 4000 символов, свойственные SQL типу VARCHAR2:
А вот операторы сравнения для (N)CLOB работают только в PL/SQL и не работают в SQL:
Выше я воспользовался функциями TO_NCLOB и TO_CLOB для явной конвертации значений VARCHAR2 в значения (N)CLOB. В следующей таблице представлены все функции для конвертации в LOB типы и обратно:
| Функция | Где работает |
|---|---|
| TO_CLOB(character_data) | SQL и PL/SQL |
| TO_BLOB(raw_data) | SQL и PL/SQL |
| TO_LOB(long_data) | SQL and PL/SQL |
| TO_NCLOB(character_data) | SQL и PL/SQL |
| TO_RAW(blob_data) | только PL/SQL |
Как видим, функция TO_RAW недоступна в SQL и, отсюда, возможности конвертации между BLOB и RAW в SQL ограничены. Например:
Зато в PL/SQL работают явная и неявная конвертации между BLOB и RAW:
Рассмотренные возможности по работе со значениями LOB как с VARCHAR2 получили название SQL семантика для LOB’ов (SQL semаntics for LOBs). С их использованием связаны некоторые ограничения, как мы увидим ниже.
С точки зрения PL/SQL большие объекты делятся на:
В вышеприведенных примерах с PL/SQL мы имели дело с временными LOB’ами.
Изменения внутренних постоянных LOB’ов (в отличие от внешних или временных) в СУБД Oracle подчиняются транзакциям. Убедимся в этом, отменив только что сделанные изменения:
Типичный алгоритм для чтения или изменения постоянного LOB’а с помощью PL/SQL таков:
Приведу пример выгрузки данных из постоянного CLOB’а во внешний файл. Для доступа к внешним файлам потребуется создать директорию, например:
Альтернативно, можно выгрузить CLOB во внешний файл, пользуясь SQL семантикой для LOB и не прибегая к DBMS_LOB :
Тип данных BFILE содержит указатель на внешний файл, который
Пример чтения BFILE и записи во временный BLOB:
| Процедура / Функция | Что делает |
|---|---|
| FILEGETNAME | возвращает имя директории и файла BFILE |
| FILEEXISTS | проверяет, что файл BFILE существует |
| FILEOPEN | открывает файл BFILE |
| FILEISOPEN | проверяет, что файл BFILE открыт |
| FILECLOSE | закрывает файл BFILE |
| FILECLOSEALL | закрывает все открытые в сеансе файлы BFILE |
Вместо чтения BFILE по частям пакет DBMS_LOB позволяет
Пример загрузки текстового файла во временный CLOB (аналогично можно загрузить и в постоянный CLOB):
Приведу неполный список процедур и функций DBMS_LOB для чтения, анализа и изменения значений BLOB, CLOB и NCLOB:
| Процедура / Функция | Что делает |
|---|---|
| APPEND | добавляет один LOB в конец другого |
| COPY | копирует все или часть содержимого LOB’а в другой LOB |
| ERASE | удаляет все или часть содержимого LOB’а |
| GETLENGTH | возвращает размер LOB’а |
| INSTR | ищет «подстроку» в LOB’е |
| ISOPEN | проверяет, открыт ли LOB |
| ISTEMPORARY | проверяет, временный ли LOB |
| READ | читает данные LOB’а |
| SUBSTR | получает «подстроку» из LOB’а |
| TRIM | сокращает размер LOB’а до указанного |
| WRITE | записывает данные в LOB |
| WRITEAPPEND | записывает данные в конец LOB’а |
Следующий эксперимент покажет разницу между внутренними и внешними постоянными LOB’ами. Помещу в поле bfile_col таблицы lobs_tab объект BFILE и скопирую единственную строку таблицы во вторую строку:
Команда INSERT привела к тому, что значения bfile_col в обеих строках связаны с одним и тем же внешним файлом, и его изменение отразится на обоих значениях.
Аналогично, при присваивании BLOB и (N)CLOB переменных в PL/SQL мы получаем независимые копии LOB’ов:
9 SQL Semantics and LOBs
This chapter describes SQL semantics that are supported for LOBs. These techniques allow you to use LOBs directly in SQL code and provide an alternative to using LOB-specific APIs for some operations.
This chapter contains these topics:
Using LOBs in SQL
You can access CLOB and NCLOB datatypes using SQL VARCHAR2 semantics, such as SQL string operators and functions. ( LENGTH functions can be used with BLOB datatypes as well as CLOB and NCLOB s.) These techniques are beneficial in the following situations:
When performing operations on LOBs that are relatively small in size (up to about 100K bytes).
After migrating your database from LONG columns to LOB datatypes, any SQL string functions, contained in your existing PL/SQL application, will continue to work after the migration.
SQL semantics are not recommended in the following situations:
When you need to use advanced features such as random access and piecewise fetch, you should use LOB APIs.
When performing operations on LOBs that are relatively large in size (greater than 1MB) using SQL semantics can impact performance. Using the LOB APIs is recommended in this situation.
SQL semantics are used with persistent and temporary LOBs. (SQL semantics do not apply to BFILE columns as BFILE is a read-only datatype.)
SQL Functions and Operators Supported for Use with LOBs
Many SQL operators and functions that take VARCHAR2 columns as arguments also accept LOB columns. The following list summarizes which categories of SQL functions and operators are supported for use with LOBs. Details on individual functions and operators are given in Table 9-1.
The following categories of SQL functions and operators are supported for use with LOBs:
(Some comparison functions are not supported for use with LOBs.)
(Some conversion functions are not supported for use with LOBs.)
The following categories of functions are not supported for use with LOBs:
Note that although pre-defined aggregate functions are not supported for use with LOBs, you can create user-defined aggregate functions to use with LOBs. See the Oracle Database Data Cartridge Developer’s Guide for more information on user-defined aggregate functions.
Details on individual functions and operators are given in Table 9-1. This table lists SQL operators and functions that take VARCHAR2 types as operands or arguments, or return a VARCHAR2 value, and indicates in the «SQL» column which functions and operators are supported for CLOB and NCLOB datatypes. (The LENGTH function is also supported for the BLOB datatype.)
The DBMS_LOB PL/SQL package supplied with Oracle Database supports using LOBs with most of the functions listed in Table 9-1 as indicated in the «PL/SQL» column.
Implicit Conversion of CLOB to CHAR Types
Table 9-1 SQL VARCHAR2 Functions and Operators on LOBs
| Category | Operator / Function | SQL Example / Comments | SQL | PL/SQL |
|---|---|---|---|---|
| Concatenation | ||, CONCAT() | BETWEEN | CNV | CNV |
| Conversion | DECOMPOSE | CNV | CNV | |
| Conversion | HEXTORAW | No | CNV | |
| Conversion | TO_MULTI_BYTE INSERT INTO. SELECT TO_LOB(longCol). Note that TO_LOB can only be used to create or insert into a table with LOB columns as SELECT FROM a table with a LONG column. | N/A | N/A | |
| Conversion | TO_CLOB | No | N/A | |
| Unicode | INSTR2, SUBSTR2, LENGTH2, LIKE2 | These functions use UCS2 code point semantics. | No | CNV |
| Unicode | INSTR4, SUBSTR4, LENGTH4, LIKE4 | These functions use UCS4 code point semantics. | No | CNV |
| Unicode | INSTRC, SUBSTRC, LENGTHC, LIKEC | These functions use complete character semantics. | No | CNV |
UNICODE Support
Variations on the INSTR, SUBSTR, LENGTH, and LIKE functions are provided for Unicode support. (These variations are indicated as «Unicode» in the «Category» column of Table 9-1.)
for a detailed description on the usage of UNICODE functions.
Codepoint Semantics
UCS2 codepoint semantics are used for AL16UTF16 and UTF8 character sets.
UCS4 codepoint semantics are used for all other character sets, such as AL32UTF8.
Return Values for SQL Semantics on LOBs
The return type of a function or operator that takes a LOB or VARCHAR2 is the same as the datatype of the argument passed to the function or operator.
Oracle Database SQL Reference for details on the CONCAT function and the concatenation operator (||).
A LOB instance is always accessed and manipulated through a LOB locator. This is also true for return values: SQL functions and operators return a LOB locator when the return value is a LOB instance.
Any LOB instance returned by a SQL function is a temporary LOB instance. LOB instances in tables (persistent LOBs) are not modified by SQL functions, even when the function is used in the SELECT list of a query.
LENGTH Return Value for LOBs
The return value of the LENGTH function differs depending on whether the argument passed is a LOB or a character string:
Implicit Conversion of LOB Datatypes in SQL
Some LOB datatypes support implicit conversion and can be used in operations such as cross-type assignment and parameter passing. These conversions are processed at the SQL layer and can be performed in all client interfaces that use LOB types.
Implicit Conversion Between CLOB and NCLOB Datatypes in SQL
The database enables you to perform operations such as cross-type assignment and cross-type parameter passing between CLOB and NCLOB datatypes. The database performs implicit conversions between these types when necessary to preserve properties such as character set formatting.
Note that, when implicit conversions occur, each character in the source LOB is changed to the character set of the destination LOB, if needed. In this situation, some degradation of performance may occur if the data size is large. When the character set of the destination and the source are the same, there is no degradation of performance.
After an implicit conversion between CLOB and NCLOB types, the destination LOB is implicitly created as a temporary LOB. This new temporary LOB is independent from the source LOB. If the implicit conversion occurs as part of a define operation in a SELECT statement, then any modifications to the destination LOB do not affect the persistent LOB in the table that the LOB was selected from as shown in the following example:
«Implicit Conversions Between CLOB and VARCHAR2» for information on PL/SQL semantics support for implicit conversions between CLOB and VARCHAR2 types.
«Implicit Character Set Conversions with LOBs» for more information on implicit character set conversions when loading LOBs from BILEs.
Oracle Database SQL Reference for details on implicit conversions supported for all datatypes.
Unsupported Use of LOBs in SQL
Table 9-2 lists SQL operations that are not supported on LOB columns.
Table 9-2 Unsupported usage of LOBs in SQL
| SQL Operations Not Supported | Example of unsupported usage |
|---|---|
| SELECT DISTINCT | |
| UNION, INTERSECT, MINUS (Note that UNION ALL works for LOBs.) SELECT clobCol1 from tab1 UNION SELECT clobCol2 from tab2; SELECT. FROM. WHERE tab1.clobCol = tab2.clobCol CREATE INDEX clobIndx ON tab(clobCol). VARCHAR2 and RAW Semantics for LOBsThe following semantics, used with VARCHAR2 and RAW datatypes, also apply to LOBs: Defining a CHAR buffer on a CLOB You can define a VARCHAR2 for a CLOB and RAW for a BLOB column. You can also define CLOB and BLOB types for VARCHAR2 and RAW columns. Selecting a CLOB column into a CHAR buffer or VARCHAR2 If a CLOB column is selected into a VARCHAR2 variable, then data stored in the CLOB column is retrieved and put into the CHAR buffer. If the buffer is not large enough to contain all the CLOB data, then a truncation error is thrown and no data is written to the buffer. After successful completion of the SELECT operation, the VARCHAR2 variable holds as a regular character buffer. In contrast, when a CLOB column is selected into a local CLOB variable, the CLOB locator is fetched. Selecting a BLOB column into a RAW When a BLOB column is selected into a RAW variable, the BLOB data is copied into the RAW buffer. If the size of the BLOB exceeds the size of the buffer, then a truncation error is thrown and no data is written to the buffer. LOBs Returned from SQL FunctionsWhen a LOB is returned from a SQL function, the result returned is a temporary LOB. Your application should view the temporary LOB as local storage for the data returned from the SELECT operation as follows: In PL/SQL, the temporary LOB has the same lifetime (duration) as other local PL/SQL program variables. It can be passed to subsequent SQL or PL/SQL VARCHAR2 functions or queries as a PL/SQL local variable. The temporary LOB will go out of scope at the end of the program block at which time, the LOB is freed. These are the same semantics as those for PL/SQL VARCHAR2 variables. At any time, nonetheless, you can use a DBMS_LOB.FREETEMPORARY call to release the resources taken by the local temporary LOBs. In OCI, the temporary LOBs returned from SQL queries are always in ‘session’ duration, unless a user-defined duration is present, in which case, the temporary LOBs will be in the user-defined duration. Ensure that your temporary tablespace is large enough to store all temporary LOB results returned from queries in your program(s). The following example illustrates selecting out a CLOB column into a VARCHAR2 and returning the result as a CHAR buffer of declared size: IS NULL and IS [NOT] NULL Usage with VARCHAR2s and CLOBsYou can use the IS NULL and IS [NOT] NULL operators with LOB columns. When used with LOBs, these operators determine whether a LOB locator is stored in the row. In the SQL 92 standard, a character string of length zero is distinct from a NULL string. The return value of IS NULL differs when you pass a LOB compared to a VARCHAR2 : When you pass an initialized LOB of length zero to the IS NULL function, zero ( FALSE ) is returned. These semantics are compliant with the SQL standard. When you pass a VARCHAR2 of length zero to the IS NULL function, TRUE is returned. WHERE Clause Usage with LOBsSQL functions with LOBs as arguments, except functions that compare LOB values, are allowed in predicates of the WHERE clause. For example, the LENGTH function can be included in the predicate of the WHERE clause: Работа с большими объектами в PL/SQL (BFILE, LOB, SecureFiles)
Прежде чем переходить к основному материалу, необходимо указать, что все примеры данного раздела основаны на следующем определении таблицы (см. файл source_code.sql): Рис. 1. Водопад Драйер-Хоуз возле Мунисинга (штат Мичиган) Таблица содержит информацию о водопадах, расположенных в северной части штата Мичиган. На рис. 1 изображен водопад Драйер-Хоуз возле Мунисинга; в замерзшем состоянии его часто посещают альпинисты. Понятие локатора LOBРис. 2. Локатор LOB указывает на объект в базе данных Этот механизм в корне отличается от того, как работают другие типы данных. Переменные и значения в столбцах LOB содержат локаторы больших объектов, которые идентифицируют реальные данные, хранящиеся в другом месте базы данных или вне ее. Для работы с данными типа LOB нужно сначала извлечь локатор, а затем с помощью встроенного пакета DBMS_LOB получить и/или модифицировать реальные данные. Так, для получения двоичных данных фотографии, локатор которой хранится в столбце BLOB из приведенной ранее таблицы, необходимо выполнить следующие действия: Не все эти действия являются обязательными; не огорчайтесь, если что-то пока остается непонятным. Далее все эти операции будут описаны более подробно. LOB-ДАННЫЕ В ДОКУМЕНТАЦИИ ORACLEЕсли вам часто приходится работать с большими объектами, настоятельно рекомендуем ознакомиться со следующими документами Oracle: Большие объекты — пустые и равные NULLОчень важно понимать это различие, потому что у типов LOB способ проверки наличия либо отсутствия данных получается более сложным, чем у скалярных типов. Для традиционных скалярных типов достаточно простой проверки IS NULL : Итак, проверять нужно два условия вместо одного. Для создания пустого объекта BLOB используется функция EMPTY_BLOB (). Для типов CLOB и NCLOB используется функция EMPTY_CLOB (). Запись данных в объекты LOBЧтение данных из объектов LOBВ результате выполнения этого кода выводится следующий текст: Особенности типа BFILEКак упоминалось ранее, типы данных BLOB, CLOB и NCLOB представляют внутренние большие объекты, хранящиеся в базе данных, в то время как BFILE является внешним типом. Между объектами BFILE и внутренними LOB существуют три важных различия: Создание локатора BFILEЛокатор BFILE — всего лишь комбинация псевдонима каталога и имени файла. Реальный файл и каталог даже не обязаны существовать. Иначе говоря, Oracle позволяет создавать псевдонимы для несуществующих каталогов, а BFILENAME — локаторы для несуществующих файлов. Иногда это бывает удобно. Доступ к данным BFILEРезультат выполнения этого кода: Использование BFILE для загрузки столбцов LOBНе путайте предупреждения с ошибками PL/SQL; загрузка все равно будет выполнена в соответствии с запросом. Следующий пример SQL*Plus демонстрирует загрузку данных из внешнего файла с использованием LOADCLOBFROMFILE : SecureFiles и BasicFilesПо данным тестирования Oracle, повышение быстродействия от использования SecureFiles составляет от 200 до 900%. В простом тесте с загрузкой файлов PDF на сервер Microsoft Windows я наблюдал снижение времени загрузки от 80 до 90% от 169 секунд до 20–30 секунд (в зависимости от конфигурации и количества загрузок). В системе x86 Linux выигрыш был более скромным. Возможно, в вашей ситуации цифры будут другими, но ускорение будет наверняка! Если вы не уверены относительно базы данных, обратитесь за помощью к администратору. Устранение дубликатовСжатиеЧтобы включить режим устранения дубликатов одновременно со сжатием, укажите соответствующие параметры в определении LOB : При включении обоих режимов сначала выполняется устранение дубликатов, а затем сжатие. ШифрованиеСозданный бумажник необходимо открывать заново после каждого перезапуска экземпляра. Открытие и закрытие бумажника выполняется следующим образом: Временные объекты LOBСоздание временного объекта LOBДругой способ создания временного объекта LOB основан на объявлении переменной LOB в коде PL/SQL и присваивании ей значения. Например, следующий фрагмент создает временные объекты BLOB и CLOB : Освобождение временного объекта LOBПроцедура DBMS_LOB.FREETEMPORARY освобождает временный объект типа BLOB или CLOB в текущем временном табличном пространстве. Заголовок процедуры: В следующем примере сначала создаются, а затем освобождаются два временных объекта LOB : После вызова FREETEMPORARY освобожденный локатор LOB ( lob_loc ) помечается как недействительный. Если присвоить его другому локатору с помощью обычного оператора присваивания PL/SQL, то и этот локатор будет освобожден и помечен как недействительный. PL/SQL неявно освобождает временные объекты LOB при выходе за пределы области действия блока. Проверка статуса объекта LOBФункция ISTEMPORARY позволяет определить, является ли объект с заданным локатором временным или постоянным. Она возвращает целочисленный код: 1 для временного объекта, 0 для постоянного. Управление временными объектами LOBВременные большие объекты обрабатываются не так, как обычные постоянные. Для них не поддерживаются транзакции, операции согласованного чтения, откаты и т. д. Такое сокращение функциональности имеет ряд следствий: Встроенные операции LOBСемантика SQLВозможности, упомянутые в предыдущем разделе, Oracle называет «поддержкой семантики SQL для LOB ». С точки зрения разработчика PL/SQL это означает, что с LOB можно работать на уровне встроенных операторов (вместо отдельного пакета). Следующий пример демонстрирует некоторые возможности семантики SQL: Маленький фрагмент кода в этом примере содержит несколько интересных моментов: Семантика SQL может создавать временные объекты LOBЧтобы получить описание местонахождения водопада в верхнем регистре, сохранив возможность обновления исходного описания, необходимо получить два локатора LOB : Влияние семантики SQL на быстродействиеА теперь представьте, сколько времени потребуется для создания копии каждого объекта CLOB для его преобразования к верхнему регистру, для выделения и освобождения пространства временных объектов CLOB во временном пространстве и для посимвольного поиска данных в CLOB средним объемом в 1 Гбайт. Конечно, такие запросы навлекут на вас гнев администратора базы данных. Oracle Text и семантика SQLЗа дополнительной информацией о CONTAINS и индексах Oracle Text, игнорирующих регистр символов, обращайтесь к документации Oracle Text Application Developer’s Guide. Функции преобразования объектов LOBOracle предоставляет в распоряжение программиста несколько функций преобразования больших объектов. Перечень этих функций приведен в табл. 2. |
Тема работы с большими объектами весьма объемна, поэтому мы не сможем рассмотреть все ее аспекты. Данную статью блога следует рассматривать как введение в программирование больших объектов для разработчиков PL/SQL. Мы познакомимся с некоторыми нюансами, которые необходимо учитывать, и рассмотрим примеры важнейших операций. Хочется надеяться, что представленный материал станет хорошей основой для ваших дальнейших исследований в этой области.




