Oracle записать clob в blob

Обновлено: 07.07.2024

Working with BLOB and CLOB data types

ODAC supports Oracle 8 BLOB and CLOB datatypes. You can retrieve values of LOB fields by TOraQuery component as easy as LONG or LONG ROW fields. The difference in using LOB datatype appears when it is necessary to use these fields in SQL DML and PL/SQL statements.
For BLOB and CLOB columns only the LOB locator (the pointer to data) is stored in the table column; BLOB and CLOB data is stored in separate tablespaces. In the case of LONG or LONG RAW the entire value is stored in the table column. When you access LOB column, it is the locator which is returned. When you access LONG or LONG RAW, the entire value is returned.

This table helps us to illustrate further examples.

CREATE TABLE ClobTable (
Id NUMBER,
Name VARCHAR2(30),
Value CLOB
)

Oracle doesn’t allow to update this table by executing such statement if Value is non initialized LOB locator.

UPDATE ClobTable SET Name = :Name, Value = :Value WHERE />
To initialize LOB locator you must use EMPTY_BLOB or EMPTY_CLOB Oracle function. To return initialized locator use RETURNING clause.
For example

UPDATE ClobTable
SET
Name = :Name,
Value = EMPTY_CLOB()
WHERE
Id = :Id
RETURNING
Value
INTO
:Value

In spite of the fact that Value is OUT parameter in this example ODAC writes LOB data to Oracle.
If you need use stored procedure to store LOB value it might be written in such a way

CREATE OR REPLACE
PROCEDURE ClobTableUpdate (p_Id NUMBER, p_Name VARCHAR2,
p_Value OUT CLOB)
is
begin
UPDATE ClobTable
SET
Name = p_Name,
Value = EMPTY_CLOB()
WHERE
Id = p_Id
RETURNING
Value
INTO
p_Value;
end;

Note Value parameter is declared as OUT but ParamType must have ptInput value to write lob data to Oracle.

OraStroredProc1.StoredProcName := "ClobTableUpdate";
OraStroredProc1.Prepare;
OraStroredProc1.ParamByName("p_Id").AsInteger := Id;
OraStroredProc1.ParamByName("p_Name").AsString := Name;
OraStroredProc1.ParamByName("Value").ParamType := ptInput;
OraStroredProc1.ParamByName("Value").AsCLOBLocator.
LoadFromFile(FileName);
OraStroredProc1.Execute;

It is important that ODAC uses ParamType property of parameters in LOB operations. If ParamType is ptInput ODAC writes data to server, if ParamType is ptOutput it reads data.
You can also use dtBlob and dtMemo datatypes with LOB parameters to write ordinary DML statements. In such a case Oracle automatically converts LONG and LONG ROW values to CLOB or BLOB data.

Вопросам использования больших объектов LOB (Large Object Bynary) зачастую приходится уделять пристальное внимание. Связано это с хранением различных файлов в таблицах базы данных (БД). Сразу же возникает вопрос, зачем хранить в БД файл, если потом придется извлекать его назад опять же в виде в файла? Ведь можно создать отдельное файловое хранилище. Ответ также оказывается простым и тривиальным - для файлового хранилища требуется дополнительно решать вопросы репликации и синхронизации, предоставление прав доступа и создание backup'a. Таким образом, если нельзя обойтись без LOB-объектов, то остается выбрать их тип - бинарный (BLOB Binary Large Object ) или символьный, называемый в БД различных провайдеров по-разному (CLOB, TEXT).

ПРИМЕЧАНИЕ : при работе с символьными данными необходимо учитывать кодировку. Это вопрос будет учтен при записи текстового файла в таблицы БД и выгрузки из БД.

Описание примера

В статье рассматривается пример записи и чтения нескольких типов файлов в поля BLOB и CLOB (TEXT). В качестве серверов БД были использованы Oracle 10g Enterprise Edition, Oracle 10g Express Edition и MySQL 5.1.

Пример представляет собой проект Eclipse, реализующий все принципы ООП (объектно-ориентированное программирование) - наследование, инкапсуляция и полиморфизм. Структура проекта представлена на следующем скриншоте.


В директории «lib» размещаются библиотеки JDBC для подключения к серверам БД. При подключении к серверу 10g Enterprise Edition использовалась библиотека ojdbc7.jar. В случае использования сервера 10g Express Edition были использованы библиотеки ojdbc14_g.jar, ojdbc14.jar. Для подключения в IDE Eclipse библиотеки к проекту необходимо ее выделить и в контекстном меню выбрать "Build Path/Add to Build Path". Чтобы отключить использование библиотеки в проекте используйте вкладку "Java Build Path" в окне свойств проекта.

Пример включает следующие программные модули :

DAOBase.java базовый модуль создания подключения к серверу БД и работы с полями BLOB и CLOB (TEXT);
MainTest.java главный модуль тестирования методов чтения и записи LOB;
MySQLDAO.java модуль создания подключения к серверу MySQL, наследует DAOBase.java;
OracleDAO.java модуль создания подключения к серверу Oracle, наследует DAOBase.java;
Файлы для тестирования aircraft.jpg, отчет.xlsx, текст.txt

Приложение в двух разнотипных БД создает таблицы с полями BLOB и CLOB (TEXT), в которые сначала файлы записываются, потом выполняется их чтение. Представленные процедуры записи и чтения больших объектов Вы можете использовать в своих приложениях практически без доработок.

Создание подключений Connection к различным серверам БД описано здесь и в данной статье не рассматривает (код представлен). Пример можно скачать здесь.

Описание базового модуля, DAOBase.java

Базовый модуль включает следующие основные методы :

МетодНазначениеПримечание
public void createConnection() Создание Connection, подключение к БД Переопределяется для каждого провайдера БД
public Connection getConnection() Получение Connection
public void closeConnection() Закрытие Connection
public boolean execSQL (sql) Выполнение SQL-запроса
public boolean writeBlob(table, field, pk, id, fpath) Запись файла в поле BLOB таблицы
public long readBlobToFile(table, field, pk, id, fpath) Извлечение объекта BLOB в файл
public boolean writeClob(table, field, id, fpath) Запись файла в поле CLOB таблицы
public long readClobToFile(table, field, id, path) Извлечение объекта CLOB в файл
public String readClobData(table, field, id) Чтение объекта CLOB

Параметры процедур записи и чтения больших объектов LOB включают наименование таблиц table, наименование LOB-полей field, наименование поля первичного ключа pk, идентификатор записи id и путь к файлу fpath. При необходимости Вы можете доработать данные процедуры и включить в качестве параметра наименование схемы Schema(Oracle) или базы данных Database (MySQL). Не исключено, что и первичный ключ может содержать несколько полей.

ПРИМЕЧАНИЕ :
1. Следует обратить внимание, что методы работы с полями BLOB и CLOB не переопределяются согласно представленной выше таблице. Но это касается баз данных Oracle и MySQL, используемые в примере. Т.е. можно сказать, что методы JDBC «справляются» с полями LOB данных провайдеров. К тому же в MySQL используется тип TEXT, а в Oracle CLOB.
2. Можно использовать различные методы записи в поля LOB содержимое файлов, что будет продемонстрировано на примере MySQL.

Ниже представлен листинг DAOBase.java, где методы работы с полями BLOB и CLOB не включают код. Это сделано преднамеренно для наглядного представления общей структуры модуля DAOBase.java. В противном случае листинг сильно увеличится и «за деревьями нельзя будет увидеть лес». Код методов работы с полями LOB описан далее.

Листинг DAOBase.java

Процедуры создания createTable (sql) и удаления dropTable(sql) таблицы БД не включены в общий список методов DAOBase.java, поскольку в примере выполняют вспомогательную функцию и используется для «подыгрыша». Как правило, структура БД меняется редко и нет необходимости включать в приложение процедуры, которые не используются.

Листинг методов чтения и записи данных в поле BLOB

Две вспомогательные функции readBlobField и writeFromBlob2Stream имеют модификаторы private и используются основным методом readBlobToFile при выгрузке файла из БД.

Для записи файла в поле BLOB используется метод setBinaryStream, получающий в качестве параметра поток FileInputStream. При выгрузке файла из БД в методе readBlobToFile сначала читается объект BLOB (readBlobField), после этого он записывается в выходной поток OutputStream в методе writeFromBlob2Stream, где используется метод чтения в бинарный поток getBinaryStream() объекта BLOB.

Листинг процедур чтения и записи данных в поле CLOB

Две вспомогательные функции readClobField и readFromClob2Stream имеют модификаторы private и используются основными методами readClobToFile, readClobData при выгрузке файла из БД.

Чтобы учесть кодировку символов при записи текстового файла в БД используется InputStreamReader и BufferedReader. Для записи файла в поле CLOB/TEXT используется метод setCharacterStream объекта CLOB, которому передается BufferedReader. При выгрузке файла из БД в методе readClobToFile сначала читается объект CLOB (readClobField ), после этого он записывается в выходной поток BufferedWriter в методе readFromClob2Stream, где используется метод чтения в символьный поток getCharacterStream() объекта CLOB.

Листинг OracleDAO.java

Листинг модуля OracleDAO.java включает переопределенные метод createConnection() и метод создания процедур БД createTable. Структуры таблиц, описанные в константах TABLE_blobs и TABLE_files в виде SQL-скриптов, включают только поля идентификаторов id и поля data соответствующих типов LOB. По умолчанию поля дата имеют значения NULL, поскольку используются в методах при обновлении.

При создании объекта в конструкторе сразу же создается подключение к серверу БД. В качестве свойства объекту подключения передается кодировка устанавливаемого соединения "utf8".

Листинг MySQLDAO.java

Листинг модуля MySQLDAO.java включает переопределенные метод createConnection(), метод создания процедур БД createTable и метод writeClob, который демонстрирует другой подход записи символьного файла в поле TEXT. В данном методе файловый поток FileInputStream сразу же перенаправляется в поток setAsciiStream. Но чтобы не исказить символы использовалась соответствующая кодировка в таблице БД и подключении к серверу. Родительский метод writeClob класса DAOBase.java также сработал без нареканий. Таким образом, в Вашем распоряжении 2 подхода записи текстового файла в БД MySQL.

Структуры таблиц, описанные в константах TABLE_blobs и TABLE_files в виде SQL-скриптов, включают только поля идентификаторов id и поля data соответствующих типов LOB. Для таблицы "files" установлена кодировка "UTF8". По умолчанию поля дата имеют значения NULL, т.к. используются в методах при обновлении.

При создании объекта в конструкторе сразу же создается подключение к серверу БД, которому в качестве свойства передается кодировка устанавливаемого соединения "utf8".

Тестирование примера

Главный модуль приложения MainTest.java выполняет тестирование методов записи файлов в БД и выгрузки в файл. Основной метод тестирования testDAO в качестве параметра принимает базовый класс (полиморфизм). В методе testDAO сначала проверяется установка подключения к серверу БД. Если подключение установлено, то создаются таблицы, в которые записываются и извлекаются файлы.

Результаты тестирования

Исходный код рассмотренного примера записи и чтения больших объектов LOB с использованием JDBC можно скачать здесь (7.27 Мб).

При тестировании примера необходимо определить параметры подключения к Вашему серверу БД - схема (база данных), логин и пароль.

Управление данными Oracle CLOB и BLOB с помощью JDBC

Операции для вставки данных больших объектов (включая тип BLOB BLOB NCLOB BFILE): вставка нулевого значения-> получение столбца нулевого значения и обновление блокировки-> обновление поля большого объекта.

Основные моменты обработки данных типа LOB, полученных с помощью операции запроса: сначала используйте данные поля LOB для получения объекта InputStream или OutputStream, а затем работайте с ним по мере необходимости, если вам нужно извлечь данные, вы получите объект InputStream, если вам нужно обновить данные поля LOB, вы получите объект OutputStream ,

Программа разделена на два уровня: 1) JdbcUtil обеспечивает базовый доступ к базе данных и управление транзакциями, и 2) уровень DAO вызывает JdbcUtil для предоставления услуг DAO.

[color = brown] Таблица Content_text, содержащая данные CLOB: [/ color]

[color = brown] таблица content_bin, содержащая данные BLOB: [/ color]

------------ Вставьте данные в таблицу content_bin:

[размер = большой] [b] =============================== слой DAO ============= ========== [/ b] [/ size]
--------- Запрос к таблице content_text

-------------- Запрос к таблице content_bin

Интеллектуальная рекомендация

Поверните строку в целые числа

Тема Описание Преобразуйте строку в целое число (реализация функции integer.valueof (строка), но строка не совпадает 0), требуя функции библиотеки, которая нельзя использовать для преобразования целых.

Docker создает репликацию Redis Master-Slave

Centos установить докер быстрый старт докера Создать Dockerfile Поместите файл на сервер Linux, создайте папку / usr / docker / redis и поместите его в этот каталог Выполните следующий код в каталоге .


Установка GateOne на новом CentOS7

Установка GateOne на новом CentOS7 В последнее время исследуются такие инструменты, как WebSSH2, в настоящее время требуется встроить терминал ssh в веб-приложение и найти GateOne. GateOne - это веб-в.


Примечания к исследованию Qt4 (5), QWaitCondition of QThread Learning


Практические занятия: решения проблем системы управления обучением

Сразу после получения задания будет много трудностей и много проблем. Хорошо иметь проблему, а это значит, что вы можете получить новые знания. Неважно, есть ли проблемы, ключ в том, как их решить. пр.

Вам также может понравиться


искробезопасная практика (5) обратный индекс

задний план Поисковые системы обычно создают инвертированный индекс ключевых слов. Ключевое слово - индекс, за которым следуют веб-страницы, содержащие ключевое слово. На этот раз, используя данные мо.


Решение центра тяжести неправильного многоугольника

Справочник статей Во-первых, решение центра тяжести неправильных многоугольников 1.1 Метод расчета треугольника центра тяжести 1.2 Метод расчета площади треугольника 1.3 Метод расчета площади полигона.

До OpenEdge 10 работа с данными ограничивалась максимальным объемом 32K. В OpenEdge 10 были введены новые типы данных, которые позволили работать с объемами данных превышающие данное ограничение.

BLOB (Binary Large Object) - тип данных предназначен для хранение больших бинарных данных, таких как картинки, аудио - видео записи и т.д.

CLOB (Character Large Object) - тип данных предназначен для хранения больших текстовых данных заданной кодировки.

Третьим типом данных для работы с большими объемами данных, появившемся с OpenEdge 10 является тип LONGCHAR, но о нем мы уже говорили.

Стоит отметить, что в отличие от типа данных LONGCHAR, типы данных BLOB и CLOB могут быть определены только для полей таблиц и не могут быть определены для переменных.


РАБОТА С ТИПАМИ БОЛЬШИХ ДАННЫХ

COPY-LOB осуществляет копирование больших типов данных. При этом невозможно напрямую осуществлять копирование данных между типами BLOB и CLOB. Для этого необходимо скопировать данные из CLOB или BLOB источников в MEMPTR или LONGCHAR с преобразованием данных, а впоследствии уже осуществить копирование из MEMPTR или LONGCHAR в CLOB или BLOB .

COPY-LOB [FROM]source-lob | FILE source-filename>
[STARTING AT n] [FOR length]
TO target-lob> [OVERLAY AT n [TRIM]] |
FILE target-filename [APPEND]>
[NO-COVERT | CONVERT <[SOURCE CODEPAGE codepage]
[TARGET CODEPAGE codepage]>]
[NO-ERROR].

FROM - определяет источник данных для копирования:

[OBJECT] source-lob - определяет источник данных для копирования в качестве которого может выступать переменные MEMPTR или LONGCHAR типа, либо поля таблиц типов BLOB и CLOB.

FILE source-filename - определяет имя файла, содержимое которого необходимо скопировать.

STARTING AT n - определяет целочисленное значение позиции, с которой начинается чтение данных из источника. Если позиция не определена, то по умолчанию она принимается равное 1. Для байтовых типов данных таких как BLOB или MEMPTR стартовая позиция определяет позицию байта, а для текстовых типов, таких как CLOB или LONGCHAR - позицию символа с которого начинается чтение данных.

FOR length - определяет целочисленное значение байт для байтовых источников данных, или количество символов для текстовых типов, которое необходимо скопировать. По умолчанию, читаются все данные до конца.

ТО - определяет приемник копируемых данных:

[OBJECT] target-lob - определяет приемник копируемых данных, в качестве которого могут выступать переменные MEMPTR или LONGCHAR типа, либо поля таблиц типов BLOB и CLOB.

OVERLAY AT n [TRIM] - определяет целочисленное значение позиции, с которой начинается вставка копируемых данных в источник. Если позиция не определена, то по умолчанию она принимается равное 1. Для байтовых типов данных, таких как BLOB или MEMPTR, стартовая позиция определяет позицию байта, а для текстовых типов, таких как CLOB или LONGCHAR - позицию символа с которого начинается вставка данных.

FILE target-filename [APPEND] - определяет имя файла, в который осуществляется копирование данных.

NO-CONVERT - не осуществлять конвертацию копируемых данных.

CONVERT <[SOURCE CODEPAGE codepage] [TARGET CODEPAGE codepage]> - осуществляет конвертацию копируемых данных.

Читайте также: